SQLSERVER16进制与10进制转换
最近⼯控项⽬中遇到的16进制与10进制转换,在.NET中⽐较容易实现,在SQLSERVER中发现没有直接的转换,尤其是出现超出范围的long负数,即⽆符号64位整数在sqlserver中的存储。⽹上的很多⽅法只适⽤于32位整数和64位正整数,64位负数⽆法实现,现将使⽤的转换⽅法记录下来。
利⽤SQLSERVER中的varbinary来间接实现。
16进制字符串转10进制bigint(0-FFFFFFFFFFFFFFFF):
由于⼆进制⽐较容易转换为bigint 所以先将字符串转为⼆进制varbinary,再转换为10进制
CREATE function[dbo].[hextoint](@s varchar(16))
returns bigint
begin
declare@result bigint
set@result=CONVERT(bigint, CONVERT(varbinary, CAST(N'0x'+@s AS char), 1))--最简单有效的⽅法16进制字符串转16进制数组
return@result
END
GO
10进制转16进制字符串(bigint正负数都可以):相同的思路⽬前可以将⼆进制varbinary转换为字符串⽐较容易,那么先将10进制转⼆进制再进⾏16进制字符串输出
CREATE function[dbo].[inttohex](@num bigint)
returns varchar(16)
begin
declare@num2varbinary(8),@r varchar(50)
set@num2=convert(varbinary(8),@num)--直接转换为⼆进制
set@r= dbo.varbin2hexstr(@num2)--⼆进制转16进制字符串
return@r
end
GO
CREATE function[dbo].[varbin2hexstr](
@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)
return@re
end
GO
以上代码测试环境WIN2003+SQLSERVER2008
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论