可能重复:获取插入行标识的最佳方法是什么?
什么时候合适?有人应该如何在T-SQL中使用不同的 IDENTITY 关键字?
IDENTITY
SELECT @@ IDENTITY,
SELECT SCOPE_IDENTITY()
SELECT IDENT_CURRENT('tablename')
看看SQL SERVER – @@IDENTITY vs SCOPE_IDENTITY() vs IDENT_CURRENT – Retrieve Last Inserted Identity of Record
从文章
SELECT @@ IDENTITY它返回连接上生成的最后一个IDENTITY值,无论生成该值的表如何,也不管生成该值的语句的范围如何 . @@ IDENTITY将返回当前会话中输入的表中的最后一个标识值 . 虽然@@ IDENTITY仅限于当前会话,但不限于当前范围 . 如果在表上有触发器导致在另一个表中创建标识,则将获得最后创建的标识,即使它是创建它的触发器 . SELECT SCOPE_IDENTITY()它返回在连接上生成的最后一个IDENTITY值以及同一范围内的语句,而不管生成该值的表 . 与@@ IDENTITY一样,SCOPE_IDENTITY()将返回在当前会话中创建的最后一个标识值,但它也会将其限制为当前范围 . 换句话说,它将返回您显式创建的最后一个标识值,而不是由触发器或用户定义的函数创建的任何标识 . SELECT IDENT_CURRENT('tablename')它返回表中生成的最后一个IDENTITY值,无论创建该值的连接如何,也不管生成该值的语句的范围如何 . IDENT_CURRENT不受范围和会话的限制;它仅限于指定的表格 . IDENT_CURRENT返回在任何会话和任何范围内为特定表生成的标识值 .
MSDN对此有很好的参考 .
简而言之,@@ IDENTITY的作用域是服务器上的当前会话(例如,如果表上还有一个触发器添加到具有IDENTITY列的表,则最终可能会在INSERT之后检索错误的IDENTITY值) .
SCOPE_IDENTITY()将返回当前范围的最后插入ID,即不会出现上述问题 .
IDENT_CURRENT不限于任何会话,它返回表级别的信息(在任何会话中为该表生成的最后一个ID)
2 回答
看看SQL SERVER – @@IDENTITY vs SCOPE_IDENTITY() vs IDENT_CURRENT – Retrieve Last Inserted Identity of Record
从文章
MSDN对此有很好的参考 .
简而言之,@@ IDENTITY的作用域是服务器上的当前会话(例如,如果表上还有一个触发器添加到具有IDENTITY列的表,则最终可能会在INSERT之后检索错误的IDENTITY值) .
SCOPE_IDENTITY()将返回当前范围的最后插入ID,即不会出现上述问题 .
IDENT_CURRENT不限于任何会话,它返回表级别的信息(在任何会话中为该表生成的最后一个ID)