5

自己インクリメントキーである PK があります。レコードをデータベースに挿入し、その PK を取得して別の挿入で使用する必要があります。

ただし、これを1回のトランザクションで行いたいと思います。それは可能ですか?アイデアは、私がしなければならない更新/挿入のいずれかで何かが失敗した場合、すべてをロールバックできるということですが、コミットを行う必要があるという印象を受けています。

最初は 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 に答える