SQL Server中Oracle的RowID等效
在SQL Server中,Oracle的RowID有什么相同之处?
来自Oracle文档
ROWID伪列
对于数据库中的每一行,ROWID伪列都会返回该行的地址。 Oracle数据库rowid值包含查找行所需的信息:
最接近相当于这SQL Server是rid
它有三个组成部分File:Page:Slot
。
在SQL Server 2008中,可以使用未%%physloc%%
和不受支持的%%physloc%%
虚拟列来查看。 这会返回一个binary(8)
值,其中页面标识位于前四个字节中,然后是2个字节的文件标识,然后是2个字节的页面上的插槽位置。
标量函数sys.fn_PhysLocFormatter
或sys.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