--方式2
CREATE FUNCTION Binary2HexStr(@bin VARBINARY(8000))
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @re VARCHAR(8000),@i INT
SELECT @re='',@i=datalength(@bin)
WHILE @i>0
SELECT @re=substring('0123456789ABCDEF',substring(@bin,@i,1)/16+1,1)
+substring('0123456789ABCDEF',substring(@bin,@i,1)%16+1,1)
+@re
,@i=@i-1
RETURN('0x'+@re)
END
GO
--测试
SELECT dbo.Binary2HexStr(23785)
上面的SQL同样返回0x00005CE9,但是这次返回的是字符串了,貌似问题都得以解决了,但是,只要你INT值不超过2147483648,这个问题就会出现了,执行下面的SQL返回的结果如Figure2所示:
--方式3
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
GO
--测试
SELECT dbo.BigInt2HexStr(2147483647)
SELECT dbo.BigInt2HexStr(2147483648)
执行上面的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
三、十进制转换为三十六进制
通过上面的例子修改下就能支持十进制到三十六进制的转换了:
--十进制转换为十六进制
CREATE FUNCTION BigIntTo36HexStr(@value BIGINT)
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @seq CHAR(36)
DECLARE @result VARCHAR(50)
DECLARE @digit CHAR(1)
SET @seq = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
SET @result = SUBSTRING(@seq, (@value%36)+1, 1)
WHILE @value > 0
BEGIN
SET @digit = SUBSTRING(@seq, ((@value/36)%36)+1, 1)
SET @value = @value/36
IF @value 0
SET @result = @digit + @result
END
RETURN @result
END
GO
--测试
SELECT dbo.BigIntTo36HexStr(35)
执行上面的测试SQL,返回0xZ,测试成功;