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

11
在一个 SQL Server 2005 数据库中,我们的一位远程开发人员刚刚对存储过程进行了更改,将 "select scope_identity" 改为了 "select @@identity"。您知道为什么会选择使用 @@identity 而不是 scope_identity 吗?

我知道这两者之间的区别,我只是在思考为什么你会使用@@identity而不是scope_identity。 - Lance Fisher
5个回答

18

@@IDENTITY 会返回当前会话(session)中最后一个自增长 ID 值。而 SCOPE_IDENTITY() 则会返回当前会话和相同作用域(scope)内最后一个自增长 ID 值。这两个值通常是相同的,但假设在当前语句之前触发了某个触发器,在此触发器中插入了某些内容,则 @@IDENTITY 将返回触发器的 INSERT 语句所生成的 ID 值,而不是块中的 INSERT 语句所生成的 ID 值。除非知道自己在做什么,否则使用 @@IDENTITY 通常是不正确的。


12

这里是一个链接,可以帮助区分它们。

看起来像:

  • IDENTITY - 连接上的最后一个标识。
  • SCOPE_IDENTITY - 你明确创建的最后一个标识(不包括触发器)。
  • IDENT_CURRENT('tablename') - 表中的最后一个标识,不论作用域或连接。

2

除非有一个触发器插入了一行(或类似的操作),而我真的非常想要那个触发器插入行的id,而不是我实际更改的行。

换句话说,不,没有。

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

1
也许你应该问开发人员改变的原因。

0

如果你想使用触发器,你可以添加另一个触发器,这是我能想到的唯一原因。即使如此,这也很危险,因为可能会再次添加另一个触发器,导致错误的标识符。我怀疑开发人员不知道自己在做什么。但是,老实说,最好的方法是问他为什么要进行更改。你可以将其改回去,但是开发人员需要知道除非他需要触发器标识,否则不要再这样做,因为下一次你可能无法捕捉到它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接