【问题标题】:Will SCOPE_IDENTITY Work in this Case?SCOPE_IDENTITY 在这种情况下是否有效?
【发布时间】:2012-10-10 20:08:08
【问题描述】:

我有自增键的 PK。我需要将记录插入数据库,然后取回该 PK 并在另一个插入中使用它。

但是,我想在一笔交易中完成此操作。那可能吗。这个想法是,如果我必须做的任何更新/插入失败,那么我可以回滚所有内容,但我觉得我需要进行提交。

一开始我打算在 ado.net 中执行此操作,但后来切换到存储过程,因为我认为这可能会解决这个问题。

在这种情况下,SP 会帮助我吗?

【问题讨论】:

    标签: sql sql-server ado.net scope-identity


    【解决方案1】:

    是的,scope_identity 将为您提供最新插入的 id。作为替代方案,如果您使用的是 sql server 2005+,您可以使用output clause

    INSERT INTO [MyTable]([MyCol])
    OUTPUT INSERTED.ID
    SELECT [MyCol] FROM [MySourceTable];
    

    【讨论】:

      【解决方案2】:

      怎么样:

      BEGIN TRANSACTION
      BEGIN TRY
      
         INSERT INTO dbo.YourFirstTable(.....)
         VALUES(.......)
      
         DECLARE @newID INT
         SELECT @newID = SCOPE_IDENTITY()
      
         INSERT INTO dbo.YourSecondTable(ID, .......)
         VALUES(@newID, ........)
      
         COMMIT TRANSACTION
      END TRY
      BEGIN CATCH
          SELECT 
              ERROR_NUMBER() AS ErrorNumber,
              ERROR_SEVERITY() AS ErrorSeverity,
              ERROR_STATE() AS ErrorState,
              ERROR_PROCEDURE() AS ErrorProcedure,
              ERROR_LINE() AS ErrorLine,
              ERROR_MESSAGE() AS ErrorMessage
      
          ROLLBACK TRANSACTION
      END CATCH
      

      应该在任何版本的 SQL Server 2005 或更新版本中工作。

      仅通过获取 SCOPE_IDENTITY() 值,您绝对不会“破坏”交易......将其包装到例如一个存储过程,或者只是从您的调用代码中调用它。

      【讨论】:

      • @chobo2:将其放入存储过程并调用该过程 - 这是迄今为止最简单的解决方案...
      • 好吧,如果它更容易的话。 2个问题。如果将 ado.net 存储过程包装在事务中并回滚,会发生什么情况。你还需要它在 SP 中吗?其次,如果您需要从 2 次插入中返回 id 会发生什么情况,Scope_Identity 仍然可以工作吗?
      • @chobo2: SCOPE_IDENTITY() 返回最后插入的 IDENTITY 值 - 最后一个 ONE 值。如果您插入两行 - 不,那么它不起作用(只返回插入的 last 值)。不确定您将其“包装”在事务中是什么意思 - 这里已经有一个事务。但是如果这个存储过程中有回滚,那么任何“包装”事务也将被回滚 - SQL Server 并没有真正的嵌套/独立事务......
      • 嗯,我该怎么做,然后我不能做:插入,范围,插入范围:)
      • @chobo2: NO - 数据将被插入 - 只是尚未提交。但是当它被插入时,新的IDENTITY 值正在被定义——你可以把它们读出来。现在,如果事务最终被回滚,这些 PK 标识值将被“遗忘”(例如,它们被使用,但被回滚),这就是IDENTITY 列中可能出现的间隙。但是您肯定需要阅读 SQL Server 中的事务事务处理!查看相关的 MSDN 文档。
      猜你喜欢
      • 1970-01-01
      • 2012-06-02
      • 1970-01-01
      • 2019-12-14
      • 1970-01-01
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 2023-01-07
      相关资源
      最近更新 更多