获取插入行身份的最佳方法?

插入行的IDENTITY的最佳方式是什么?

我知道@@IDENTITYIDENT_CURRENTSCOPE_IDENTITY但不了解每个人的优缺点。

有人能解释一下这些差异,以及我应该什么时候使用它们?


  • @@IDENTITY在所有范围内返回当前会话中任何表生成的最后一个标识值。 你需要小心 ,因为它跨越了示波器。 您可以从触发器中获取值,而不是当前的语句。

  • SCOPE_IDENTITY()返回为当前会话中的任何表和当前范围生成的最后一个标识值。 一般你想用什么

  • IDENT_CURRENT('tableName')返回为任何会话和任何范围中的特定表生成的最后一个标识值。 这可以让你指定你想从哪个表中获得值,以防上述两者不是你所需要的( 非常少见 )。 另外,正如@Guy Starbuck所说:“如果你想为没有插入记录的表获取当前的IDENTITY值,你可以使用它。”

  • INSERT语句的OUTPUT子句可让您访问通过该语句插入的每一行。 由于它是针对特定语句的范围,因此比上述其他函数更直接 。 但是,它有点冗长 (你需要插入到表变量/临时表中,然后查询),并且即使在语句被回滚的错误情况下它也会给出结果。 也就是说,如果您的查询使用并行执行计划,这是获取身份的唯一保证方法 (不能关闭并行性)。 但是,它在触发器之前执行,不能用于返回触发器生成的值。


  • 我相信检索插入ID的最安全和最准确的方法是使用输出子句。

    例如(取自以下MSDN文章)

    USE AdventureWorks2008R2;
    GO
    DECLARE @MyTableVar table( NewScrapReasonID smallint,
                               Name varchar(50),
                               ModifiedDate datetime);
    INSERT Production.ScrapReason
        OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate
            INTO @MyTableVar
    VALUES (N'Operator error', GETDATE());
    
    --Display the result set of the table variable.
    SELECT NewScrapReasonID, Name, ModifiedDate FROM @MyTableVar;
    --Display the result set of the table.
    SELECT ScrapReasonID, Name, ModifiedDate 
    FROM Production.ScrapReason;
    GO
    

    我说的和其他人一样,所以每个人都是对的,我只是想说清楚。

    @@IDENTITY返回客户端连接到数据库的最后一个事件的ID。
    大多数时候这工作正常,但有时触发器会插入一个你不知道的新行,并且你会从这个新行获得ID,而不是你想要的

    SCOPE_IDENTITY()解决了这个问题。 它返回您在发送到数据库的SQL代码中插入的最后一个内容的ID。 如果触发器去创建额外的行,它们不会导致返回错误的值。 万岁

    IDENT_CURRENT返回任何人插入的最后一个ID。 如果其他应用恰好在不幸的时间插入另一行,您将获得该行的ID而不是您的ID。

    如果您想安全玩,请始终使用SCOPE_IDENTITY() 。 如果你坚持使用@@IDENTITY并且稍后有人决定添加一个触发器,那么你的所有代码都会中断。

    链接地址: http://www.djcxy.com/p/16905.html

    上一篇: Best way to get identity of inserted row?

    下一篇: How do I insert multiple rows WITHOUT repeating the "INSERT INTO dbo.Blah" part of the statement?