5

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

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

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

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

4

2 回答 2

7

是的,scope_identity 会给你最新插入的 id。作为替代方案,如果您使用的是 sql server 2005+,则可以使用output 子句

INSERT INTO [MyTable]([MyCol])
OUTPUT INSERTED.ID
SELECT [MyCol] FROM [MySourceTable];
于 2012-10-10T20:15:40.313 回答
3

怎么样:

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()值,您绝对不会“破坏”事务......将其包装到例如存储过程中,或者只是从您的调用代码中调用它。

于 2012-10-10T20:16:58.120 回答