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?