【问题标题】:Appropriate Uses of the `IDENTITY` in TSQL [duplicate]SQL中“IDENTITY”的适当使用[重复]
【发布时间】:2011-05-22 18:22:12
【问题描述】:

可能重复:
Best way to get identity of inserted row?

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

  • 选择@@IDENTITY,
  • 选择 SCOPE_IDENTITY()
  • SELECT IDENT_CURRENT('tablename')

【问题讨论】:

    标签: sql tsql syntax identity


    【解决方案1】:

    看看SQL SERVER – @@IDENTITY vs SCOPE_IDENTITY() vs IDENT_CURRENT – Retrieve Last Inserted Identity of Record

    来自文章

    选择@@IDENTITY

    它返回最后一个 IDENTITY 值 在连接上产生,不管 产生值的表, 并且无论其范围如何 产生值的语句。 @@IDENTITY 将返回最后一个 输入到表中的标识值 您当前的会话。而@@IDENTITY 仅限于当前会话,它 不限于当前范围。 如果你的表上有一个触发器 导致在 另一张桌子,你会得到 最后创建的身份,甚至 如果它是创建它的触发器。

    SELECT SCOPE_IDENTITY()

    它返回最后一个 IDENTITY 值 在连接上产生并由 同一范围内的声明, 不管产生的表 价值。 SCOPE_IDENTITY(),比如 @@IDENTITY,将返回最后一个 当前创造的身份价值 会话,但它也会将其限制为 您当前的范围也是如此。其他 的话,它会返回最后一个 您明确表示的身份值 创造,而不是任何身份 由触发器或用户创建 定义函数。

    SELECT IDENT_CURRENT(‘tablename’)

    它返回最后一个 IDENTITY 值 在一个表中产生,无论 创造价值的联系,以及 不论范围 产生值的语句。 IDENT_CURRENT 不受范围限制 和会议;它仅限于 指定的表。 IDENT_CURRENT 返回 为 a 生成的标识值 任何会话中的特定表和任何 范围。

    【讨论】:

    • 先生,在什么情况下我们可能需要访问标识列的值?你能给我举个例子吗?
    • 如果您希望将 Identity 值用作外键,或者在插入新对象后在应用程序中使用它来加载。
    • 并且不要假设返回的值是正确的:support.microsoft.com/kb/2019779 另一种解决方法是在 INSERT 语句中使用 OUTPUT 子句来捕获新的标识值。
    【解决方案2】:

    MSDN对此有很好的参考。

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

    SCOPE_IDENTITY() 将返回当前作用域的最后插入 ID,即不会给您上述问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 2017-09-13
      相关资源
      最近更新 更多