Sql server內部函式fn_PhysLocFormatter存在解析錯誤
有網友指出,SQL Server 2012中fn_PhysLocFormatter內部函式在解析資料行記錄位置時存在錯誤,見:http://www.itpub.net/thread-1751655-1-1.html
實際測試後發現,一是2008R2中同樣存在問題,二是不僅頁號解析存在問題,槽號解析也存在同樣問題。
下面先檢視錶NT_SiteInfo的資料行記錄位置。
select SiteID,%%physloc%%,sys.fn_PhysLocFormatter(%%physloc%%) from NT_SiteInfo
SiteID |
%%physloc%% |
sys.fn_PhysLocFormatter(%%physloc%%) |
1 |
0xE900000001000000 |
(1:59648:0) |
23 |
0xE900000001000100 |
(1:59648:1) |
24 |
0xE900000001000200 |
(1:59648:2) |
|
...... |
|
149 |
0xE900000001007F00 |
(1:59648:127) |
150 |
0xE900000001008000 |
(1:59648:128) |
151 |
0xE900000001008100 |
(1:59648:33024) |
152 |
0xE900000001008200 |
(1:59648:33280) |
|
...... |
|
226 |
0xE90000000100CC00 |
(1:59648:52224) |
227 |
0xE90000000100CD00 |
(1:59648:52480) |
228 |
0x4B02000001000000 |
(1:587:0) |
229 |
0x4B02000001000100 |
(1:587:1) |
|
...... |
|
360 |
0x4B02000001007F00 |
(1:587:127) |
361 |
0x4B02000001008000 |
(1:587:128) |
362 |
0x4B02000001008100 |
(1:587:33024) |
363 |
0x4B02000001008200 |
(1:587:33280) |
|
...... |
|
422 |
0x4B0200000100BD00 |
(1:587:48384) |
423 |
0x4B0200000100BE00 |
(1:587:48640) |
424 |
0x3C05000001000000 |
(1:1340:0) |
425 |
0x3C05000001000100 |
(1:1340:1) |
|
...... |
|
552 |
0x3C05000001008000 |
(1:1340:128) |
553 |
0x3C05000001008100 |
(1:1340:33024) |
|
|
|
596 |
0x3C0500000100AC00 |
(1:1340:44032) |
597 |
0x9978000001000000 |
(1:39288:0) |
|
...... |
|
658 |
0x9978000001003D00 |
(1:39288:61) |
下面檢視錶NT_SiteInfo分配的資料頁情況。
dbcc ind(wjgk,nt_siteinfo,0)
PagePID |
IAMFID |
IAMPID |
PageType |
IndexLevel |
NextPagePID |
PrevPagePID |
238 |
NULL |
NULL |
10 |
NULL |
0 |
0 |
233 |
1 |
238 |
1 |
0 |
587 |
0 |
587 |
1 |
238 |
1 |
0 |
1340 |
233 |
1340 |
1 |
238 |
1 |
0 |
30873 |
587 |
30873 |
1 |
238 |
1 |
0 |
0 |
1340 |
Microsoft未公開的偽列%%physloc%%,型別為Binary(8),返回表中記錄的RowID,格式是:前4位元組表示頁號,中間2位元組表示檔案號,最後2位元組表示槽號。
對照上面的實際資料,可以發現sys.fn_PhysLocFormatter在解析記錄位置時,既有采用高位元組在前的BIG_ENDIAN格式,又有采用低位元組在前的LITTLE_ENDIAN格式,造成採用高位元組在前的BIG_ENDIAN格式解析的資料錯誤:
頁號解析:
E9000000解析為59648(E900),錯誤,實際應為233(E9)
4B020000解析為576(24B),正確
3C050000解析為1340(53C),正確
99780000解析為39288(9978),錯誤,實際應為30873(7899)
槽號解析:
8000解析為128(0080),正確
8100解析為33024(8100),錯誤,應為129(0081)
相關文章
- Sql server內部函式fn_PhysLocFormatter存在解析錯誤(續)SQLServer函式ORM
- sql server 建立內聯表值函式SQLServer函式
- 急 !!SQL SERVER錯誤SQLServer
- SQL Server 內建轉換函式介紹SQLServer函式
- SQL Server 2008一個酷酷的函式:fn_PhysLocFormatter,返回記錄的rowidSQLServer函式ORM
- 如何在 Go 中優雅的處理和返回錯誤(1)——函式內部的錯誤處理Go函式
- SQL Server的“錯誤:9004”SQLServer
- SQL Server 錯誤日誌SQLServer
- Sql Server 日期函式SQLServer函式
- SQL SERVER 字串函式SQLServer字串函式
- SQL server錯誤:53和 SQL server錯誤:17 ,小樣你在劫難逃SQLServer
- 如何在函式內部定義函式?函式
- SQL Server最佳化標量函式改寫內聯表值函式SQLServer函式
- SQL Server 容易忽略的錯誤SQLServer
- Microsoft SQL Server,錯誤: 20582ROSSQLServer
- 如何在函式計算內部中自定義DNS解析函式DNS
- SQL Server常用函式整理SQLServer函式
- Sql Server系列:字串函式SQLServer字串函式
- Sql Server系列:聚合函式SQLServer函式
- Sql Server系列:排序函式SQLServer排序函式
- Sql server 分割符函式SQLServer函式
- SQL SERVER 數學函式SQLServer函式
- SQL SERVER 系統函式SQLServer函式
- SQL SERVER 自定義函式SQLServer函式
- SQL Server函式總結SQLServer函式
- SQL Server CONVERT() 函式SQLServer函式
- Sql Server函式全解(1):字串函式SQLServer函式字串
- Sql Server函式全解(一)字串函式SQLServer函式字串
- Sql Server判斷資料庫、表、儲存過程、函式是否存在SQLServer資料庫儲存過程函式
- Sql Server函式全解(2):數學函式SQLServer函式
- Sql Server函式全解(5):系統函式SQLServer函式
- SQL Server ErrorLog 錯誤日誌SQLServerError
- Mysql與Sql Server DATEDIFF函式MySqlServer函式
- Sql Server系列:自定義函式SQLServer函式
- Sql Server系列:系統函式SQLServer函式
- SQL SERVER 函式中文文件SQLServer函式
- Sql Server 2005函式SQLServer函式
- Sql Server函式全解(五)之系統函式SQLServer函式