【问题标题】:Using @@IDENTITY in SQL on a specific table在特定表的 SQL 中使用 @@IDENTITY
【发布时间】:2010-01-05 22:02:32
【问题描述】:

如何获取特定表的@@IDENTITY?

我一直在做

select * from myTable 

我假设这会设置范围,然后从 SSMS 中的同一窗口 SQL 查询窗口运行

select @@IDENTITY as identt

它返回 identt 作为 null 这是不期望的,因为 myTable 中已经有很多条目..

我希望它返回下一个可用的 ID 整数。

myTable 有一个 ID 列设置为主键和自动增量。

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:

    您可以使用IDENT_CURRENT

    IDENT_CURRENT( 'table_name' )
    

    请注意,IDENT_CURRENT 返回在任何会话和任何范围中的表的最后一个标识值。这意味着,如果在您的身份值之后插入另一个身份值,那么您将不会检索您插入的身份值。

    【讨论】:

    • 如果您需要下一个标识值,请将 IDENT_INCR('table_name') 的值添加到此值
    • Ident_Incr 的使用仅适用于调查目的,不适用于生产代码,因为您可能会陷入竞争状态。
    • @Andrew:你能解释一下吗?使用 IDENT_CURRENT 已经够糟糕了
    • @gbn :我们在另一个问题 gbn 上这样做了,ident_current(yourtable) + ident_incr(yourtable) 为您提供下一个值 - 无需添加一行来找出下一个值是什么.如果我有一个搞砸的系统,我想调查它“认为”下一个值是什么,我会使用它,但仅限于那种情况/调查(或使用 DMV,同样的区别)
    【解决方案2】:

    您只能在插入后真正使用SELECT @@IDENTITY - 最后一次插入到具有 IDENTITY 列的表中是您将获得的值。

    您不能将其“限制”在一个表中——@@IDENTITY 中的值——顺便说一下,我强烈建议使用 SCOPE_IDENTITY() 代替!! - 是设置的任何 IDENTITY 列的最后一个值。

    @@IDENTITY 的问题在于它会报告插入任何表的最后一个 IDENTITY 值 - 如果您的 INSERT 到您的数据表会导致例如将条目写入审计表的触发器并且该审计表有一个 IDENTITY 字段,您将取回该 IDENTITY 值 - 而不是插入到表中的值。 SCOPE_IDENTITY() 解决了这个问题。

    【讨论】:

      【解决方案3】:

      IDENT_CURRENT 做你想做的事。但是不要。

      这是对marc_s的回答

      【讨论】:

        【解决方案4】:

        我从来不知道@@IDENTITY 可以这样使用,我只用它来访问新插入记录的 ID。

        【讨论】:

          【解决方案5】:

          没错。 @@IDENTITY 不能以您认为的方式使用。它只能在 INSERT 到表中之后使用。让我们考虑一个场景:

          你有两张表:Order(主键:OrderID),OrderDetails(外键:OrderID)

          你表演 插入订单 值('枕头') -- 请注意,值中没有提到 OrderId,因为它是自动编号(主键)

          现在您要对 OrderDetail 执行插入操作。但是您并不总是记得在插入“枕头”的记录之前 Order 表中有多少条记录,因此您不记得插入 Order 表的最后一个 PrimaryKey 是什么。您可以,但即便如此,您也不想在插入 OrderDetail 表时特别提及插入(假设 OrderID 为 1)。

          因此,您的 OderDetail 插入会像这样工作: 插入订单详情 值(@@IDENTITY,'软枕头')

          希望这能解释@@IDENTITY 的用户。

          【讨论】:

            猜你喜欢
            • 2012-11-13
            • 1970-01-01
            • 2011-05-22
            • 2011-04-01
            • 2017-11-01
            • 1970-01-01
            • 1970-01-01
            • 2015-01-26
            • 1970-01-01
            相关资源
            最近更新 更多