一、背景
前段时间群里的朋友问了一个问题:“在查询时增加一个递增序列,如:0x00000001,即每一个都是36进位(0—9,A--Z),0x0000000Z后面将是0x00000010,生成一个像下面的映射表“:

(Figure1:效果图)
二、十进制转换为十六进制
在网上有很多资料关于使用SQL语句把十进制转换为十六进制的资料,比如:
执行返回值为0x00005CE9,但是需要注意的是,这本应该返回二进制的,但是二进制估计是阅读起来太麻烦,所以SQL Server 返回了十六进制,如果你想要保存为字符串并不是简单把这直接使用CONVERT,类似下面的SQL是不会有返回值的:
所以网上出现了如下的函数来转换为十六进制的字符串:
上面的SQL同样返回0x00005CE9,但是这次返回的是字符串了,貌似问题都得以解决了,但是,只要你INT值不超过2147483648,这个问题就会出现了,执行下面的SQL返回的结果如Figure2所示:
从进制的转换运算出发,改进了宋沄剑写了的SQL脚本,修改参数为BIGINT类型:
执行上面的SQL,返回的十六进制如Figure3所示:
(Figure3:数据对比)
要想理解上面的函数,你需要理解十进制转换为十六进制的运算规则,假如十进制数23785转为十六进制,计算的公式的步骤为:
23785/16=1486余9,十进制的9对应十六进制的9;
1486/16=92余14,十进制的14对应十六进制的E;
92/16=5余12,十进制的12对应十六进制的C;
5/16=0余5,十进制的5对应十六进制的5;
将余数对应的十六进制倒写,即5CE9,所以十进制23785 = 十六进制0x5CE9
三、十进制转换为三十六进制
通过上面的例子修改下就能支持十进制到三十六进制的转换了:
执行上面的测试SQL,返回0xZ,测试成功;
四、补充说明
其实编写Binary2HexStr函数是没有必要的,因为SQL Server提供系统的函数支持转换master.dbo.fn_varbintohexstr或者master.dbo.fn_varbintohexsubstring,例如:
不过他们一样存在对十进制数据的转换不能超过2147483648的限制。
五、参考文献
<a href="http://blog.csdn.net/huangchonghai/article/details/1499205">SqlServer中varbinary转换成字符串</a>
<a href="http://bbs.csdn.net/topics/390876207">关于递增序列的问题</a>
<a href="http://baike.baidu.com/view/883725.htm?fr=aladdin">进制转换</a>
<a href="http://blog.csdn.net/zhengzizhi/article/details/4543079">SQL之36进制转换成10进制数据</a>
<a href="http://www.cnblogs.com/xugang/archive/2012/10/22/2733593.html">SQL Server 中,实现 varbinary 与 varchar 类型之间的数据转换</a>
<a href="http://www.cnblogs.com/skyfei/archive/2006/09/13/502861.html">SQL Server: convert varbinary to varchar</a>