首页 >数据库 >mysql教程 >Oracle ROWID 在 SQL Server 中的等价物是什么?

Oracle ROWID 在 SQL Server 中的等价物是什么?

Barbara Streisand
Barbara Streisand原创
2024-12-25 16:43:14606浏览

What is the SQL Server Equivalent of Oracle's ROWID?

相当于 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn