2013年10月9日 星期三

[2008] MS SQL 所提供類似ORACLE之RowId 功能 [%%physloc%%]

對於ORACLE使用者而言,許多情況下ROWID指令是相當必要且簡便之指令,如刪除重複資料時。MSSQL 2008版本起已具有類似ORACLE ROWID指令的%%physloc%%函數(為Unleashed指令,不保證未來版本支援),可取得資料列(Row)的物理位址,格式為Binary(8),其中1~4表示Page No5~6代表File no7~8Slot 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 

          







測試-2fn_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之用法及如何開發此類型資料表函數。


          







測試3-查詢:(刪除, 修改類似)
SELECT A.*
FROM Test A
WHERE %%physloc%% = 0xC100000001000100





沒有留言:

張貼留言