Welcome

首页 / 数据库 / SQLServer / SQL SERVER 16进制与10进制转换

SQL SERVER 16进制与10进制转换2014-03-23 cnblogs shaocm最近工控项目中遇到的16进制与10进制转换,在.NET中比较容易实现,在SQLSERVER中发现没有直接 的转换,尤其是出现超出范围的long负数,即无符号64位整数在sqlserver中的存储。网上找的很多方法 只适用于32位整数和64位正整数,64位负数无法实现,现将使用的转换方法记录下来。

利用SQLSERVER中的varbinary来间接实现。

16进制字符串转10进制bigint(0-FFFFFFFFFFFFFFFF):

由于二进制比较容易转换为bigint 所以先将字符串转为二进制varbinary,再转换为10进制

CREATEfunction [dbo].[hextoint](@s varchar(16)) returns bigintbegin declare @result bigint set @result=CONVERT(bigint, CONVERT(varbinary, CAST(N"0x" + @s AS char), 1))--最简单有效的方法 return @resultEND GO
10进制转16进制字符串(bigint正负数都可以):相同的思路目前可以将二进制varbinary转换为字 符串比较容易,那么先将10进制转二进制再进行16进制字符串输出

CREATE function [dbo].[inttohex](@num bigint) returns varchar(16)begindeclare @num2 varbinary(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)asbegindeclare @re varchar(8000),@i intselect @re="",@i=datalength(@bin)while @i>0select @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 @reendGO
以上代码测试环境WIN2003+SQLSERVER2008