sql - 相当于SQL Server中Oracle的RowID

标签 sql sql-server tsql rowid row-number

相当于 SQL Server 中 Oracle 的 RowID 是什么?

最佳答案

From the Oracle docs

ROWID Pseudocolumn

For each row in the database, the ROWID pseudocolumn returns the address of the row. Oracle Database rowid values contain information necessary to locate a row:

  • The data object number of the object
  • The data block in the datafile in which the row resides
  • The position of the row in the data block (first row is 0)
  • The datafile in which the row resides (first file is 1). The file number is relative to the tablespace.

SQL Server 中与此最接近的等效项是 rid,它具有三个组件 File:Page:Slot

在 SQL Server 2008 中,可以使用未记录且不受支持的 %%physloc%% 虚拟列来查看这一点。这会返回一个 binary(8) 值,前四个字节中包含页面 ID,然后是文件 ID 的 2 个字节,最后是页面上插槽位置的 2 个字节。

标量函数sys.fn_PhysLocFormattersys.fn_PhysLocCracker TVF可用于将其转换为更易读的形式

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)   |
+--------------------+----------------+

请注意,查询处理器不利用这一点。虽然可以WHERE子句中使用它

SELECT *
FROM T
WHERE %%physloc%% = 0x2926020001000100 

SQL Server 将不会直接查找指定的行。相反,它会进行全表扫描,评估每一行的 %%physloc%% 并返回匹配的行(如果有)。

要反转前面提到的 2 个函数执行的过程并获取与已知文件、页面、插槽值相对应的 binary(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))

关于sql - 相当于SQL Server中Oracle的RowID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/909155/

相关文章:

sql - 帮助 MySQL 查询?

ruby - 在 Ruby 中读取带有特殊字符的 CSV 文件并存储到 SQL Server 中

SQL 条件排序依据

javascript - SQL 高级搜索/忽略空查询

mysql - 按存储对象数组的 JSON 列过滤行

sql-server - 没有列名列表的tsql标识插入

tsql - 选择0以连接多行

sql-server - 为什么使用 "fake table"ObjectProperty 确定某些系统表为 "TableIsFake"?

sql - 存储过程的表值参数可以有默认值吗

asp.net - 在 ASP.NET 中显示 SQL Server 数据库中的图像的最佳方式是什么?