對於ORACLE使用者而言,許多情況下ROWID指令是相當必要且簡便之指令,如刪除重複資料時。MSSQL 2008版本起已具有類似ORACLE ROWID指令的%%physloc%%函數(為Unleashed指令,不保證未來版本支援),可取得資料列(Row)的物理位址,格式為Binary(8),其中1~4表示Page No,5~6代表File no,7~8為Slot No。並提供fn_PhysLocFormatter純量函數及fn_PhysLocCracker資料表函數以供取得其位置:
ü
sys.fn_physlocformatter純量函數,可將%%physloc%%物理位置轉換為(file:page:slot)格式字串。
ü
fn_PhysLocCracker資料表函數,可將物理位置拆解為file/page/slot置於不同欄位中。
建立資料
SELECT * INTO Test
FROM (VALUES ('A')
, ('B')
, ('C')
, ('A')
) AS Temp(VAL)
測試-1: fn_PhysLocFormatter
SELECT A.*
, %%physloc%% AS [%%physloc%%]
, sys.fn_PhysLocFormatter(%%physloc%%) AS [File:Page:Slot]
FROM Test A
測試-2:fn_PhysLocCracker
SELECT A.*
, %%physloc%% AS [%%physloc%%]
, C.file_id
, C.page_id
, C.slot_id
FROM Test A
CROSS APPLY fn_PhysLocCracker(%%physloc%%) C
註:後續文章再介紹CROSS APPLY之用法及如何開發此類型資料表函數。
CROSS APPLY fn_PhysLocCracker(%%physloc%%) C
註:後續文章再介紹CROSS APPLY之用法及如何開發此類型資料表函數。
測試3-查詢:(刪除, 修改類似)
SELECT A.*
FROM Test A
WHERE %%physloc%% =
0xC100000001000100
沒有留言:
張貼留言