在SQL Server 2005里可以通过%%lockress%%得到数据行对应的物理路径信息,在SQL Server2008里还可以通过%%physloc%% 得到,用sys.fn_PhysLocFormatter 将得到的binary数据转换后就是%%lockress%% 的值,但是,这几个在MSDN里都没有介绍.
%%lockress%% 得到值包含了3部分:文件编号,页编号和位置编号,并以冒号分隔.
select *,%%lockres%% as phys from dbTest
得到的结果是:
id name phys
----------- ---------- --------------------------------
1 A 1:77:0
2 B 1:77:1
3 C 1:77:2
----------- ---------- --------------------------------
1 A 1:77:0
2 B 1:77:1
3 C 1:77:2
在SQL Server2008里执行
select *,%%physloc%% as phys from dbTest
得到的结果是:
id name phys
----------- ---------- ------------------
1 A 0x7300000001000000
2 B 0x7300000001000100
3 C 0x7300000001000200
----------- ---------- ------------------
1 A 0x7300000001000000
2 B 0x7300000001000100
3 C 0x7300000001000200
在SQL Server2008里执行
select *,sys.fn_PhysLocFormatter(%%physloc%%) as physfrom dbTest
得到的结果是:
id name phys
----------- ---------- ----------------------------
1 A (1:115:0)
2 B (1:115:1)
3 C (1:115:2)
----------- ---------- ----------------------------
1 A (1:115:0)
2 B (1:115:1)
3 C (1:115:2)
因为SQL Sever2005和SQL Server2008在不同的机器上,所以得到的物理信息是不一样的,得到的这个信息,相当于是一张表的一个隐藏的唯一键列,所以通过这个可以很方便的处理一些问题,比如删除没有主键表里的重复数据,但是MSDN里没有相关的说明,所以使用时要考虑一些风险.