一、背景
前段時間群裡的朋友問了一個問題:“在查詢時增加一個遞增序列,如: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>