如何将SQL Server的Log Sequence Number(LSN)十六进制值转换为十进制
SQL Server LSN十六进制格式转十进制方法
SQL Server的日志序列号(LSN)是三段由冒号分隔的十六进制字符串,结构为[VLF序列号]:[日志块偏移]:[槽号],转换可按以下步骤操作:
手动转换步骤
- 第一步:将目标LSN按冒号
:分割为三个独立的十六进制子串,示例000000dc:00003146:0002分割后得到三个子串:000000dc、00003146、0002。 - 第二步:分别将每个十六进制子串转换为十进制数值,十六进制前缀的0不影响转换结果:
- 第一段
000000dc转十进制:十六进制dc= 13×16 + 12 = 220 - 第二段
00003146转十进制:十六进制3146= 3×16³ + 1×16² + 4×16 + 6 = 12614 - 第三段
0002转十进制:十六进制2= 2
- 第一段
- 第三步:根据使用场景选择输出形式:
- 若需要独立分段值,直接使用上述三个转换结果即可
- 若需要拼接为完整的单值十进制LSN,需将第二段补前导0到10位、第三段补前导0到5位,再和第一段按顺序拼接,示例拼接结果为
220000001261400002
SQL Server内置方法转换
直接在数据库中执行以下T-SQL代码即可完成转换,无需手动计算:
DECLARE @InputLSN VARCHAR(50) = '000000dc:00003146:0002' -- 替换冒号为点后用PARSENAME拆分三段,转二进制再转大整数 SELECT CONVERT(BIGINT, CONVERT(VARBINARY, '0x' + PARSENAME(REPLACE(@InputLSN, ':', '.'), 3), 1)) AS 第一段十进制值, CONVERT(BIGINT, CONVERT(VARBINARY, '0x' + PARSENAME(REPLACE(@InputLSN, ':', '.'), 2), 1)) AS 第二段十进制值, CONVERT(BIGINT, CONVERT(VARBINARY, '0x' + PARSENAME(REPLACE(@InputLSN, ':', '.'), 1), 1)) AS 第三段十进制值, -- 拼接为完整单值十进制LSN CONCAT( CONVERT(BIGINT, CONVERT(VARBINARY, '0x' + PARSENAME(REPLACE(@InputLSN, ':', '.'), 3), 1)), RIGHT(CONCAT('0000000000', CONVERT(BIGINT, CONVERT(VARBINARY, '0x' + PARSENAME(REPLACE(@InputLSN, ':', '.'), 2), 1))), 10), RIGHT(CONCAT('00000', CONVERT(BIGINT, CONVERT(VARBINARY, '0x' + PARSENAME(REPLACE(@InputLSN, ':', '.'), 1), 1))), 5) ) AS 完整十进制LSN
注意事项
- 转换时需将每一段视为无符号十六进制数,避免带符号转换出现负数结果
- 完整单值LSN的补位规则是SQL Server官方标准,可直接用于
fn_dblog等系统函数的参数查询
内容的提问来源于stack exchange,提问作者luca canonico
相关产品推荐
相关产品推荐

