我应该如何获得插入行的身份?
我知道@@IDENTITY和IDENT_CURRENT和SCOPE_IDENTITY,但不理解它们所附带的含义或影响。
谁能解释一下它们的区别,以及我什么时候使用它们?
我应该如何获得插入行的身份?
我知道@@IDENTITY和IDENT_CURRENT和SCOPE_IDENTITY,但不理解它们所附带的含义或影响。
谁能解释一下它们的区别,以及我什么时候使用它们?
当前回答
我不能与其他版本的SQL Server对话,但在2012年,直接输出工作得很好。您不需要为临时表而烦恼。
INSERT INTO MyTable
OUTPUT INSERTED.ID
VALUES (...)
顺便说一下,这种技术也适用于插入多行。
INSERT INTO MyTable
OUTPUT INSERTED.ID
VALUES
(...),
(...),
(...)
输出
ID
2
3
4
其他回答
在你的插入语句之后,你需要添加这个。确认插入数据的表名。您将得到当前行,而不是刚才插入语句所影响的行。
IDENT_CURRENT('tableName')
我认为检索插入的id最安全、最准确的方法是使用output子句。
例如(摘自以下MSDN文章)
使用AdventureWorks2008R2; 去 声明@MyTableVar表(NewScrapReasonID smallint, 名字varchar (50), ModifiedDate datetime); 插入生产。ScrapReason 输出插入。ScrapReasonID,插入。名字,插入。ModifiedDate 到@MyTableVar VALUES (N'操作符错误',GETDATE()); ——显示表变量的结果集。 SELECT NewScrapReasonID, Name, ModifiedDate FROM @ mytablear; ——显示表的结果集。 SELECT ScrapReasonID, Name, ModifiedDate 从Production.ScrapReason; 去
我不能与其他版本的SQL Server对话,但在2012年,直接输出工作得很好。您不需要为临时表而烦恼。
INSERT INTO MyTable
OUTPUT INSERTED.ID
VALUES (...)
顺便说一下,这种技术也适用于插入多行。
INSERT INTO MyTable
OUTPUT INSERTED.ID
VALUES
(...),
(...),
(...)
输出
ID
2
3
4
从MSDN
@@IDENTITY、SCOPE_IDENTITY和IDENT_CURRENT是类似的函数,它们返回插入到表的IDENTITY列中的最后一个值。 @@IDENTITY和SCOPE_IDENTITY将返回当前会话中在任何表中生成的最后一个标识值。然而,SCOPE_IDENTITY只返回当前范围内的值;@@IDENTITY不受特定范围的限制。 IDENT_CURRENT不受作用域和会话的限制;它仅限于指定的表。IDENT_CURRENT返回在任何会话和任何范围内为特定表生成的标识值。有关更多信息,请参见IDENT_CURRENT。
IDENT_CURRENT是一个以表作为参数的函数。 当你在表上有一个触发器时,@@IDENTITY可能返回令人困惑的结果 大多数时候SCOPE_IDENTITY是你的英雄。
总是使用scope_identity(),永远不需要其他任何东西。