首页 文章

在TSQL中适当使用`IDENTITY` [重复]

提问于
浏览
5

可能重复:获取插入行标识的最佳方法是什么?

什么时候合适?有人应该如何在T-SQL中使用不同的 IDENTITY 关键字?

  • SELECT @@ IDENTITY,

  • SELECT SCOPE_IDENTITY()

  • SELECT IDENT_CURRENT('tablename')

2 回答

  • 2

    看看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返回在任何会话和任何范围内为特定表生成的标识值 .

  • 5

    MSDN对此有很好的参考 .

    简而言之,@@ IDENTITY的作用域是服务器上的当前会话(例如,如果表上还有一个触发器添加到具有IDENTITY列的表,则最终可能会在INSERT之后检索错误的IDENTITY值) .

    SCOPE_IDENTITY()将返回当前范围的最后插入ID,即不会出现上述问题 .

    IDENT_CURRENT不限于任何会话,它返回表级别的信息(在任何会话中为该表生成的最后一个ID)

相关问题