【问题标题】:Reason for using @@identity rather than scope_identity使用 @@identity 而不是 scope_identity 的原因
【发布时间】:2008-12-09 17:11:59
【问题描述】:

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

【问题讨论】:

  • 我知道两者之间的区别,我只是想想想为什么你会使用@@identity 而不是 scope_identity。

标签: sql-server sql-server-2005


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这里是a link,可能有助于区分它们

    看起来像:

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

    【讨论】:

      【解决方案3】:

      我想不出来,除非有一个触发器然后插入了一行(或类似的),我真的很想要那个触发器插入的行的 id,而不是我物理更改的行。

      换句话说,不,不是。

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

      【讨论】:

        【解决方案4】:

        也许您应该询问开发人员进行更改的原因。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2017-05-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-11-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-27
            相关资源
            最近更新 更多