原文
SQLSERVER 16进制与10进制转换
最近工控项目中遇到的16进制与10进制转换,在.NET中比较容易实现,在SQLSERVER中发现没有直接的转换,尤其是出现超出范围的long负数,即无符号64位整数在sqlserver中的存储。网上找的很多方法只适用于32位整数和64位正整数,64位负数无法实现,现将使用的转换方法记录下来。
利用SQLSERVER中的varbinary来间接实现。
16进制字符串转10进制bigint(0-FFFFFFFFFFFFFFFF):
由于二进制比较容易转换为bigint 所以先将字符串转为二进制varbinary,再转换为10进制
begin
declare
@result
bigint
set
@result
=
CONVERT
(
bigint
,
CONVERT
(
varbinary
,
CAST
(N
'
0x
'
+
@s
AS
char
),
1
))--最简单有效的方法
return
@result
begin
declare
@num2
varbinary
(
8
),
@r
varchar
(
50
)
set
@num2
=
convert
(
varbinary
(
8
),
@num
)--直接转换为二进制
set
@r
=
dbo.varbin2hexstr(
@num2
)--二进制转16进制字符串
return
@r
CREATE function [dbo].[varbin2hexstr](
@bin varbinary(8000)
)returns varchar(8000)
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