获取插入行身份的最佳方法?
插入行的IDENTITY
的最佳方式是什么?
我知道@@IDENTITY
和IDENT_CURRENT
和SCOPE_IDENTITY
但不了解每个人的优缺点。
有人能解释一下这些差异,以及我应该什么时候使用它们?
@@IDENTITY
在所有范围内返回当前会话中任何表生成的最后一个标识值。 你需要小心 ,因为它跨越了示波器。 您可以从触发器中获取值,而不是当前的语句。
SCOPE_IDENTITY()
返回为当前会话中的任何表和当前范围生成的最后一个标识值。 一般你想用什么 。
IDENT_CURRENT('tableName')
返回为任何会话和任何范围中的特定表生成的最后一个标识值。 这可以让你指定你想从哪个表中获得值,以防上述两者不是你所需要的( 非常少见 )。 另外,正如@Guy Starbuck所说:“如果你想为没有插入记录的表获取当前的IDENTITY值,你可以使用它。”
INSERT
语句的OUTPUT
子句可让您访问通过该语句插入的每一行。 由于它是针对特定语句的范围,因此比上述其他函数更直接 。 但是,它有点冗长 (你需要插入到表变量/临时表中,然后查询),并且即使在语句被回滚的错误情况下它也会给出结果。 也就是说,如果您的查询使用并行执行计划,这是获取身份的唯一保证方法 (不能关闭并行性)。 但是,它在触发器之前执行,不能用于返回触发器生成的值。
我相信检索插入ID的最安全和最准确的方法是使用输出子句。
例如(取自以下MSDN文章)
USE AdventureWorks2008R2;
GO
DECLARE @MyTableVar table( NewScrapReasonID smallint,
Name varchar(50),
ModifiedDate datetime);
INSERT Production.ScrapReason
OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate
INTO @MyTableVar
VALUES (N'Operator error', GETDATE());
--Display the result set of the table variable.
SELECT NewScrapReasonID, Name, ModifiedDate FROM @MyTableVar;
--Display the result set of the table.
SELECT ScrapReasonID, Name, ModifiedDate
FROM Production.ScrapReason;
GO
我说的和其他人一样,所以每个人都是对的,我只是想说清楚。
@@IDENTITY
返回客户端连接到数据库的最后一个事件的ID。
大多数时候这工作正常,但有时触发器会插入一个你不知道的新行,并且你会从这个新行获得ID,而不是你想要的
SCOPE_IDENTITY()
解决了这个问题。 它返回您在发送到数据库的SQL代码中插入的最后一个内容的ID。 如果触发器去创建额外的行,它们不会导致返回错误的值。 万岁
IDENT_CURRENT
返回任何人插入的最后一个ID。 如果其他应用恰好在不幸的时间插入另一行,您将获得该行的ID而不是您的ID。
如果您想安全玩,请始终使用SCOPE_IDENTITY()
。 如果你坚持使用@@IDENTITY
并且稍后有人决定添加一个触发器,那么你的所有代码都会中断。
上一篇: Best way to get identity of inserted row?
下一篇: How do I insert multiple rows WITHOUT repeating the "INSERT INTO dbo.Blah" part of the statement?