使用@@ identity而不是scope_identity的原因

时间:2008-12-09 17:11:59

标签: sql-server sql-server-2005

在SQL Server 2005数据库上,我们的一位远程开发人员刚刚检查了对“select scope_identity”更改为“select @@ identity”的存储过程的更改。您是否知道为什么要在scope_identity上使用@@ identity?

5 个答案:

答案 0 :(得分:18)

@@IDENTITY将返回当前会话发出的最后一个标识值。 SCOPE_IDENTITY()返回当前会话和相同范围中的最后一个标识值。它们通常是相同的,但假设调用了一个触发器,它在当前语句之前的某处插入了一些内容。 @@IDENTITY将通过触发器的INSERT语句返回标识值,而不是块的insert语句。除非他知道自己在做什么,否则这通常是个错误。

答案 1 :(得分:12)

以下a link可能有助于区分它们

看起来像:

  • IDENTITY - 连接上的最后一个身份
  • SCOPE_IDENTITY - 您明确创建的最后一个身份(排除触发器)
  • IDENT_CURRENT('tablename') - 表格中的最后一个身份,无论范围或连接如何。

答案 2 :(得分:2)

我想不出任何,除非有一个触发器然后插入一行(或某些)并且我真的非常想要触发插入行的id而不是我实际改变的行。

换句话说,不,不是真的。

  • 免责声明:不是T-SQL专家:)

答案 3 :(得分:1)

也许你应该问开发者他们做出改变背后的理由。

答案 4 :(得分:0)

如果您想要使用触发器,您可以添加另一个触发器是我能想到的唯一原因。即使这样,它也很危险,因为可以添加另一个触发器并再次获得错误的身份。我怀疑开发人员不知道他在做什么。但老实说,最好的办法就是问他为什么要做出改变。您可以将其更改回来,但开发人员需要知道不要再次执行此操作,除非他需要触发器标识,因为您可能无法在下次捕获它。