在一个 SQL Server 2005 数据库中,我们的一位远程开发人员刚刚对存储过程进行了更改,将 "select scope_identity" 改为了 "select @@identity"。您知道为什么会选择使用 @@identity 而不是 scope_identity 吗?
@@IDENTITY
会返回当前会话(session)中最后一个自增长 ID 值。而 SCOPE_IDENTITY()
则会返回当前会话和相同作用域(scope)内最后一个自增长 ID 值。这两个值通常是相同的,但假设在当前语句之前触发了某个触发器,在此触发器中插入了某些内容,则 @@IDENTITY
将返回触发器的 INSERT
语句所生成的 ID 值,而不是块中的 INSERT
语句所生成的 ID 值。除非知道自己在做什么,否则使用 @@IDENTITY
通常是不正确的。
这里是一个链接,可以帮助区分它们。
看起来像:
除非有一个触发器插入了一行(或类似的操作),而我真的非常想要那个触发器插入行的id,而不是我实际更改的行。
换句话说,不,没有。
如果你想使用触发器,你可以添加另一个触发器,这是我能想到的唯一原因。即使如此,这也很危险,因为可能会再次添加另一个触发器,导致错误的标识符。我怀疑开发人员不知道自己在做什么。但是,老实说,最好的方法是问他为什么要进行更改。你可以将其改回去,但是开发人员需要知道除非他需要触发器标识,否则不要再这样做,因为下一次你可能无法捕捉到它。