You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 17:35:18