LSN的10进制和16进制之间的转换

LSN的10进制和16进制之间的转换

 

一、16进制

LSN即日志顺序号(Log Sequence Number),用16进制表示分成3段,格式为:

 

 

FSeqNo:SectorNo:SlotNo

 

 

其含义分别为:

1)  第1段:FSeqNo是虚拟日志文件(VLF)的序列号,长度为4个字节。

2)  SectorNo是VLF中扇区的序号,长度也为4个字节。

3)  SlotNo是日志所在扇区的序号,长度为2个字节。

 

 

二、10进制

10进制下的LSN类型为NUMERIC(25,0),它也是分三段,分别是:

 

1)  从0-4位(共5位)为SlotNo

2)  从5-14位(共10位)为SectorNo

3)  从15-24位(共10位)为FSeqNo

 

各部分位数不足时,左边用0补齐(FSeqNo不需要补齐,补齐也没用)。

 

三、举例

有关10进制和16进制之间的互相转换,请参考博文:《MS SQL Server10进制和16进制之间的互相转换》

 

 

DECLARE @LSN16 VARCHAR(50)

DECLARE @LSN10 NUMERIC(25, 0)

DECLARE @LSN VARCHAR(25)

 

Set @LSN16 = '00000021:00000120:0001'

 

SELECT @LSN10 = CONVERT(INT, CONVERT(VARBINARY, '0X' + SUBSTRING(@LSN16, 1,  8), 1)) * 1000000000000000

             +  CONVERT(INT, CONVERT(VARBINARY, '0X' + SUBSTRING(@LSN16, 10, 8), 1)) * 100000

             +  CONVERT(INT, CONVERT(VARBINARY, '0X' + SUBSTRING(@LSN16, 19, 4), 1))

          

SELECT @LSN10

 

SELECT @LSN = RIGHT('0000000000' + CONVERT(VARCHAR, @LSN10), 25)

 

SELECT CONVERT(VARCHAR(50), CONVERT(VARBINARY, CONVERT(INT, SUBSTRING(@LSN,  1, 10))), 2) + ':'

     + CONVERT(VARCHAR(50), CONVERT(VARBINARY, CONVERT(INT, SUBSTRING(@LSN, 11, 10))), 2) + ':'

     + CONVERT(VARCHAR(50), CONVERT(VARBINARY, CONVERT(INT, SUBSTRING(@LSN, 21, 5))), 2)

 

--返回

--33000000028800001

--00000021:00000120:00000001

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值