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
|