SCOPE_IDENTITY会在这种情况下工作吗?

时间:2012-10-10 20:08:08

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

我有PK是自增量键。我需要将记录插入数据库,然后将PK恢复并在另一个插入中使用它。

但是我想在一次交易中这样做。那可能吗。我的想法是,如果在我必须做的任何更新/插入中出现问题,那么我可以回滚所有内容,但我的印象是我需要提交。

我最初会在ado.net上做这件事,但后来切换到存储过程,因为我认为可能会解决这个问题。

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分: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()值,您肯定“打破”交易...将其包装到例如存储过程,或者只是从您的调用代码中调用它。