SQL Server 2019中BigInt转小端序HexString的方法求助
解决SQL Server中BigInt转小端序十六进制的问题
要将BigInt值转换为小端序的十六进制字符串,直接使用REVERSE函数会出错——因为它是反转整个字符串的字符顺序,而小端序要求的是反转二进制字节的顺序,再转换为十六进制。
方法1:使用自定义函数反转二进制字节
先创建一个用于反转VarBinary字节顺序的标量函数:
CREATE FUNCTION dbo.ReverseVarBinary(@Input VARBINARY(8)) RETURNS VARBINARY(8) AS BEGIN DECLARE @Result VARBINARY(8) = 0x DECLARE @Length INT = DATALENGTH(@Input) WHILE @Length > 0 BEGIN SET @Result = @Result + SUBSTRING(@Input, @Length, 1) SET @Length = @Length - 1 END RETURN @Result END
然后在你的代码中调用这个函数:
declare @Id bigint declare @HexId varchar(50) set @Id = 98360090175733911 -- 先转成BigInt对应的8字节二进制,反转字节后再转十六进制 set @HexId = CONVERT(VARCHAR(50), dbo.ReverseVarBinary(CONVERT(VARBINARY(8), @Id)), 2) select @HexId
方法2:无自定义函数的CTE实现
如果不想创建函数,可以用CTE拆分二进制字节并倒序拼接:
declare @Id bigint declare @Binary VARBINARY(8) declare @HexId varchar(50) = '' set @Id = 98360090175733911 set @Binary = CONVERT(VARBINARY(8), @Id) ;WITH Bytes AS ( SELECT SUBSTRING(@Binary, n, 1) AS Byte, n AS Position FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8)) AS Numbers(n) WHERE n <= DATALENGTH(@Binary) ) SELECT @HexId = CONCAT(@HexId, CONVERT(VARCHAR(2), Byte, 2)) FROM Bytes ORDER BY Position DESC select @HexId
为什么直接REVERSE不行?
原代码生成的十六进制字符串是大端序,比如你的@Id对应的大端十六进制是055F6B6D1E8D1917。如果直接用REVERSE(@HexId),得到的是7191D8E1D6B6F550——这是把每个字符反转,而不是按字节(两位一组)反转。小端序需要的是将字节顺序反转,最终结果应为17198D1E6D6B5F05,上述两种方法都能正确实现这个逻辑。
内容的提问来源于stack exchange,提问作者B.Berrevoets
相关产品推荐
相关产品推荐

