MS SQL Server10进制和16进制之间的互相转换

 

在MS SQLServer中常常需要用到10进制和16进制之间的互相转换,下面来总结一下。这里会涉及到CONVERT函数:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

 

一、          十进制转换为十六进制

这个比较简单。可以利用CONVERT函数,如下:


SELECT CONVERT(VARBINARY, 988)
--返回0x000003DC



二、          十六进制转换为十进制

按理说,这个和上面一样,也比较简单:


DECLARE  @VAR VARBINARY(100)
SELECT @VAR = CONVERT(VARBINARY, 988)
SELECT  CONVERT(INT, @VAR)
--返回 988



但是在实际操作过程中,十六进制数常常是以字符串表示的,这个就比较麻烦了。


SELECT CONVERT(VARBINARY, '0X1')
--返回0x305831


它只是将字符串的ASCII码返回给十六进制数。所以想要正确转换,必须要用UDF函数。在MS SQL Server2008开始,CONVERT函数对VARBINARY提供了一个参数,用于转换十六进制。下面分别说明:

1.       MS SQL Server2008之前版本

就像刚才说的必须使用UDF函数。


CREATE FUNCTION BigInt2HexStr(@value BIGINT)
RETURNS  VARCHAR(50)
AS
BEGIN
DECLARE  @seq CHAR(16)
DECLARE  @result VARCHAR(50)
DECLARE  @digit CHAR(1)
    
SET  @seq = '0123456789ABCDEF'
--求十进制的@value除以的余数,找到余数对应十六进制的值
SET  @result = SUBSTRING(@seq, (@value%16)+1, 1)
 
WHILE  @value > 0
BEGIN
SET  @digit = SUBSTRING(@seq, ((@value/16)%16)+1, 1)
SET  @value = @value/16
IF  @value <> 0
SET  @result = @digit + @result
END
 
RETURN  @result
END


 

 

2.       MS SQL Server2008及以后版本

CONVERT函数提供了一个style参数:

 


style值

输出

0(默认值)

l  将 ASCII 字符转换为二进制字节,或者将二进制字节转换为 ASCII 字符。每个字符或字节按照 1:1 进行转换。

l  如果 data_type 为二进制类型,则会在结果左侧添加字符 0x。

1, 2

l  如果 data_type 为二进制类型,则表达式必须为字符表达式。expression 必须由数量为偶数的十六进制数字(0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F、a、b、c、d、e、f)组成。如果将 style 设置为 1,字符 0x 必须为表达式中的前两个字符。如果表达式中包含的字符数为奇数或者包含任何无效的字符,则会引发错误。

l  如果转换后的表达式长度大于 data_type 长度,则会在右侧截断结果。

l  如果固定长度 data_types 大于转换后的结果,则会在结果右侧添加零。

l  如果 data_type 为字符类型,则表达式必须为二进制表达式。每个二进制字符均转换为两个十六进制字符。如果转换后的表达式长度大于 data_type 长度,则会在右侧截断结果。

l  如果 data_type 为固定大小的字符类型,并且转换后的结果长度小于其 data_type 长度,则会在转换后的表达式右侧添加空格,以使十六进制数字的个数保持为偶数。

l  对于 style 1,将在转换后的结果左侧添加字符 0x;而对于style2,则不添加字符0X。


 

利用这个参数,我们就可以非常方便地进行转换了:


SELECT CONVERT(INT, CONVERT(VARBINARY, '0X' + '12', 1))

--返回18