Equivalent of Oracle's RowID in SQL Server
在SQL Server中,Oracle的rowid等效于什么?
从Oracle文档
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是
在SQL Server 2008,它是可能的使用非法和不支持的
的标量函数
1 2 3 4 5 6 7 | 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 |
输出的例子
1 2 3 4 5 6 | +--------------------+----------------+ | %%physloc%% | File:Page:Slot | +--------------------+----------------+ | 0x2926020001000000 | (1:140841:0) | | 0x2926020001000100 | (1:140841:1) | +--------------------+----------------+ |
注意,这不是杠杆由查询处理器。虽然它是可能的使用这一
1 2 3 | SELECT * FROM T WHERE %%physloc%% = 0x2926020001000100 |
SQL服务器不直接寻求指定的行。而不是它想做全表扫描,评估
一个反向的过程进行了使用由上述2和相应的价值函数得到的
1 2 3 4 5 6 7 | 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 Server帮助。SQL Server不自动生成ID for each row在Oracle表中如是,所以你要去创造你自己的ID信息(取柱和明确在你的查询。
编辑:动态结果集的行编码(湖是在下面,但也可能等效为甲骨文的意思,我认为,从所有的评论页面,你想的东西上面。SQL Server 2005和目标,你可以使用新的排序函数功能实现动态编码行。
例如,我做我的查询:
1 2 3 4 5 | 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 |
想给你:
1 2 3 4 5 | 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 |
因此,它在编码dynamically support.microsoft.com条行。
退房的新_行数的功能。它像这样:
1 | SELECT ROW_NUMBER() OVER (ORDER BY EMPID ASC) AS ROWID, * FROM EMPLOYEE |
我必须用许多列对一个很大的表进行除尘,速度很重要。因此,我使用适用于任何表的这种方法:
1 2 3 | DELETE T FROM (SELECT ROW_NUMBER() OVER(Partition BY BINARY_CHECKSUM(*) ORDER BY %%physloc%% ) AS RowNumber, * FROM MyTable) T WHERE T.RowNumber > 1 |
上面的几个答案可以解决缺少对特定行的直接引用的问题,但如果表中的其他行发生更改,则不起作用。这就是我的标准,在技术上,答案是不足的。
Oracle rowid的一个常见用途是提供一种(某种程度上)稳定的方法来选择行,然后返回到该行进行处理(例如,更新它)。查找行(复杂连接、全文搜索或逐行浏览以及对数据应用过程测试)的方法可能不容易或不安全地重新用于限定UPDATE语句。
SQL Server RID似乎提供了相同的功能,但没有提供相同的性能。这是我看到的唯一问题,不幸的是,保留rowid的目的是避免重复一个昂贵的操作来查找一个非常大的表中的行。尽管如此,在许多情况下,性能是可以接受的。如果微软在未来的版本中调整优化器,性能问题就可以得到解决。
也可以简单地用于更新,并在过程程序中保持光标打开。然而,在大型或复杂的批处理中,这可能是昂贵的。
警告:例如,如果数据库管理员在select和update之间重建数据库,即使Oracle的rowid也不稳定,因为它是物理行标识符。因此,rowid设备应该只在作用域良好的任务中使用。
如果要对表中的行进行永久编号,请不要使用SQL Server的RID解决方案。它的性能将比旧386上的access差。对于SQL Server,只需创建一个标识列,并将该列用作集群主键。这将在表上放置一个永久的、快速的整数B树,更重要的是,每个非聚集索引都将使用它来定位行。如果您尝试在SQL Server中像在Oracle中一样进行开发,您将创建一个性能较差的数据库。你需要对引擎进行优化,而不是假装它是一个不同的引擎。
另外,请不要使用newid()用guid填充主键,这样会降低插入性能。如果必须使用guid,请使用newSequentialID()作为列默认值。但int还是会更快。
另一方面,如果您只想对查询结果的行进行编号,请使用rownumber over()函数作为查询列之一。
从http://vyaskn.tripod.com /编程_ faq.htm #问题17:
Oracle has a rownum to access rows of a table using row number or row id. Is there any equivalent for that in SQL Server? Or how to generate
output with row number in SQL Server?There is no direct equivalent to Oracle's rownum or row id in SQL
Server. Strictly speaking, in a relational database, rows within a
table are not ordered and a row id won't really make sense. But if you
need that functionality, consider the following three alternatives:
Add an
IDENTITY column to your table.Use the following query to generate a row number for each row. The following query generates a row number for each row in the authors
table of pubs database. For this query to work, the table must have a
unique key.
1
2
3
4
5
6 SELECT (SELECT COUNT(i.au_id)
FROM pubs..authors i
WHERE i.au_id >= o.au_id ) AS RowID,
au_fname + ' ' + au_lname AS 'Author name'
FROM pubs..authors o
ORDER BY RowIDUse a temporary table approach, to store the entire resultset into a temporary table, along with a row id generated by the
IDENTITY()
function. Creating a temporary table will be costly, especially when
you are working with large tables. Go for this approach, if you don't
have a unique key in your table.
请试试看
来源:https://docs.microsoft.com/en-us/sql/t-sql/data-types/uniqueidentifier-transact-sql
如果你只是想一个小的数据集编码的基本行,someting这样呢?
1 | SELECT ROW_NUMBER() OVER (ORDER BY getdate()) AS ROWID, * FROM Employees |
请参阅http://msdn.microsoft.com/en-us/library/aa260631(v=sql.80).aspx在SQL Server中,时间戳与日期时间列不同。这用于唯一标识数据库中的行,而不仅仅是表,而是整个数据库。这可以用于乐观并发。例如update[job]set[name]=@name,[xcustomdata]=@xcustomdata其中([modifiedTimestamp]=@original_modifiedTimestamp和[guid]=@original_guid
modifiedTimestamp确保您正在更新原始数据,并且如果该行发生其他更新,则会失败。
是一个基于ROWID的表隐柱,Oracle,SQL服务器,建立你自己的。Add a柱为一个
如何做:添加列的默认值,与现有的表,在SQL Server
您可以使用下面给出的方法获取rowid:
1.创建一个新表,其中包含自动递增字段
2.使用行数分析函数根据您的要求获取序列。我更喜欢这样做,因为它有助于在您希望行ID以特定字段或字段组合的升序或降序方式出现的情况下
示例:row_number()over(按deptno order by sal desc划分)
上面的示例将根据每个部门的最高工资为您提供序列号。可以选择分区依据,您可以根据需要将其删除。
我把这个例子从MS SQL的例子,你可以看到"ID可以是整数或interchanged varchar或什么的。这是相同的解决方案,我在寻找,所以我共享它。享受!!
1 2 3 4 5 6 7 8 9 10 11 12 13 | -- UPDATE statement with CTE references that are correctly matched. DECLARE @x TABLE (ID INT, Stad INT, VALUE INT, ison bit); INSERT @x VALUES (1, 0, 10, 0), (2, 1, 20, 0), (6, 0, 40, 0), (4, 1, 50, 0), (5, 3, 60, 0), (9, 6, 20, 0), (7, 5, 10, 0), (8, 8, 220, 0); DECLARE @Error INT; DECLARE @id INT; WITH cte AS (SELECT top 1 * FROM @x WHERE Stad=6) UPDATE x -- cte is referenced by the alias. SET ison=1, @id=x.ID FROM cte AS x SELECT *, @id AS 'random' FROM @x GO |