相当于 SQL Server 中 Oracle 的 RowID
Oracle 中的 ROWID 伪列唯一标识表中的每一行,并包含有关其在数据库。在SQL Server中,与ROWID最接近的等效项是rid,它由三个组成部分:File、Page和Slot。
要获取rid,可以使用未记录且不受支持的%%physloc%%虚拟列,它返回一个二进制(8)值,前四个字节为页面 ID,接下来的两个字节为文件 ID,最后两个字节为插槽位置。
您可以使用 sys.fn_PhysLocFormatter 或 sys.fn_PhysLocCracker 函数将此二进制值转换为更易读的格式:
CREATE TABLE T(X INT); INSERT INTO T VALUES(1),(2) SELECT %%physloc%% AS [%%physloc%%], sys.fn_PhysLocFormatter(%%physloc%%) AS [File:Page:Slot] FROM T
输出:
+--------------------+----------------+ | %%physloc%% | File:Page:Slot | +--------------------+----------------+ | 0x2926020001000000 | (1:140841:0) | | 0x2926020001000100 | (1:140841:1) | +--------------------+----------------+
请注意,SQL Server 不会利用rid在查询处理中,因此在 WHERE 子句中使用 %%physloc%% 将导致完整的表scan.
要将文件、页面和槽值转换回二进制 (8) 表示形式,请使用:
DECLARE @FileId int = 1, @PageId int = 338, @Slot int = 3 SELECT CAST(REVERSE(CAST(@PageId AS BINARY(4))) AS BINARY(4)) + CAST(REVERSE(CAST(@FileId AS BINARY(2))) AS BINARY(2)) + CAST(REVERSE(CAST(@Slot AS BINARY(2))) AS BINARY(2))
以上是Oracle ROWID 在 SQL Server 中的等价物是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!