位置: 编程技术 - 正文

Sql server中内部函数fn_PhysLocFormatter存在解析错误详解(sql server内存怎么设置合理)

编辑:rootadmin

推荐整理分享Sql server中内部函数fn_PhysLocFormatter存在解析错误详解(sql server内存怎么设置合理),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:sql server 内存数据库,sql server内置函数,sql server 内存数据库,sql的内置方法,sqlserver内部版本号,sql server内存表,sql内部连接,sql server 内存数据库,内容如对您有帮助,希望把文章链接给更多的朋友!

前言

有网友指出,SQL Server 中fn_PhysLocFormatter内部函数在解析数据行记录位置时存在错误,见:

SiteID

%%physloc%%

sys.fn_PhysLocFormatter(%%physloc%%)

1

0xE

(1::0)

0xE

(1::1)

0xE

(1::2)

......

0xEF

(1::)

0xE

(1::)

0xE

(1::)

0xE

(1::)

......

0xECC

(1::)

0xECD

(1::)

0x4B

(1::0)

0x4B

(1::1)

......

0x4BF

(1::)

0x4B

(1::)

0x4B

(1::)

0x4B

(1::)

......

0x4BBD

(1::)

0x4BBE

(1::)

0x3C

(1::0)

0x3C

(1::1)

......

Sql server中内部函数fn_PhysLocFormatter存在解析错误详解(sql server内存怎么设置合理)

0x3C

(1::)

0x3C

(1::)

0x3CAC

(1::)

0x

(1::0)

......

0xD

(1::)

下面查看表NT_SiteInfo分配的数据页情况。

PagePID

IAMFID

IAMPID

PageType

IndexLevel

NextPagePID

PrevPagePID

NULL

NULL

NULL

0

0

1

1

0

0

1

1

0

1

1

0

1

1

0

0

Microsoft未公开的伪列%%physloc%%,类型为Binary(8),返回表中记录的RowID,格式是:前4字节表示页号,中间2字节表示文件号,最后2字节表示槽号。

对照上面的实际数据,可以发现sys.fn_PhysLocFormatter在解析记录位置时,既有采用高字节在前的BIG_ENDIAN格式,又有采用低字节在前的LITTLE_ENDIAN格式,造成采用高字节在前的BIG_ENDIAN格式解析的数据错误:

页号解析:E解析为(E),错误,实际应为(E9)

4B解析为(B),正确

3C解析为(C),正确

解析为(),错误,实际应为()

槽号解析:

解析为(),正确

解析为(),错误,应为()

下面给出错误原因。

先看下sys.fn_PhysLocFormatter函数的定义:

再看下reverse函数:

结论:问题出在reverse函数上。

reverse函数的作用是字符反转,而不是字节反转,当遇到-FE之间的字节时,被认为是双字节字符而组合在一起参与反转操作,造成了错误。

总结

本文链接地址:https://www.jiuchutong.com/biancheng/347092.html 转载请保留说明!

上一篇:SQL Server数据库中伪列及伪列的含义详解(sql server数据库中的null(空值))

下一篇:SqlServer批量备份多个数据库且删除3天前的备份(sqlserver批量备份数据库)

免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

鄂ICP备2023003026号

网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

友情链接: 武汉网站建设 电脑维修 湖南楚通运网络