SCOPE_IDENTITY 在这种情况下是不是有效?

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

【参考方案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 文档。

以上是关于SCOPE_IDENTITY 在这种情况下是不是有效?的主要内容,如果未能解决你的问题,请参考以下文章

而不是SQL Server中的触发器丢失SCOPE_IDENTITY?

在这种情况下,是不是有 `groupBy` 的替代方法?

在这种情况下是不是有必要调用 flush()(JPA 接口)?

在这种情况下使用多态而不是枚举有啥好处吗?

在这种情况下,是不是有比 if-else 更快的替代方法?

在微服务之间共享代码 - 在这种情况下是不是合理?