SQL Server中Oracle的RowID等效

在SQL Server中,Oracle的RowID有什么相同之处?


来自Oracle文档

ROWID伪列

对于数据库中的每一行,ROWID伪列都会返回该行的地址。 Oracle数据库rowid值包含查找行所需的信息:

  • 对象的数据对象编号
  • 行所在数据文件中的数据块
  • 数据块中行的位置(第一行为0)
  • 行所在的数据文件(第一个文件是1)。 文件编号是相对于表空间的。
  • 最接近相当于这SQL Server是rid它有三个组成部分File:Page:Slot

    在SQL Server 2008中,可以使用未%%physloc%%和不受支持的%%physloc%%虚拟列来查看。 这会返回一个binary(8)值,其中页面标识位于前四个字节中,然后是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%%并返回匹配的(如果有的话)。

    为了逆转前面提到的两个函数所执行的过程并获得与已知的文件,页面,时隙值相对应的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))
    

    如果要唯一标识表中的行而不是结果集,则需要使用类似于IDENTITY列的东西。 请参阅SQL Server帮助中的“IDENTITY属性”。 SQL Server不像Oracle那样自动为表中的每一行生成一个ID,所以你不得不去创建自己的ID列并在查询中明确地获取它。

    编辑:结果集行的动态编号见下面,但这可能是一个相当于Oracle的ROWNUM,我从网页上的所有评论都假设你想要上面的东西。 对于SQL Server 2005和更高版本,您可以使用新的排序函数功能来实现行的动态编号。

    例如,我在查询我的时候这样做:

    select row_number() over (order by rn_execution_date asc) as 'Row Number', rn_execution_date as 'Execution Date', count(*) as 'Count'
    from td.run
    where rn_execution_date >= '2009-05-19'
    group by rn_execution_date
    order by rn_execution_date asc
    

    会给你:

    Row Number  Execution Date           Count
    ----------  -----------------        -----
    1          2009-05-19 00:00:00.000  280
    2          2009-05-20 00:00:00.000  269
    3          2009-05-21 00:00:00.000  279
    

    在动态编号行上还有一篇关于support.microsoft.com的文章。


    查看新的ROW_NUMBER函数。 它是这样工作的:

    SELECT ROW_NUMBER() OVER (ORDER BY EMPID ASC) AS ROWID, * FROM EMPLOYEE
    
    链接地址: http://www.djcxy.com/p/24709.html

    上一篇: Equivalent of Oracle's RowID in SQL Server

    下一篇: Add default value of datetime field in SQL Server to a timestamp