4

いくつかのテーブルの挿入と更新がそれらの前の挿入に依存しているストアドプロシージャを作成しています。これらの操作を確実に終了させるために何かを行う必要がありますか(コミットなど)、またはストアドプロシージャ呼び出しへの挿入は常に順番に実行および完了され、何も心配していませんか?

4

2 に答える 2

2

何も心配する必要はありません。心配する必要がある唯一のシナリオは、永続テーブル(非一時/非可変テーブル)を作成し、後でそのテーブルに挿入する場合です。テーブルが存在しないことを示す実行時エラーを回避するには、テーブルの作成後、レコードの挿入前に「GO」を入力する必要があります。いつでも「GO」コマンドを使用して、その時点までのすべての手続き型コマンドが完了してから、その後のコードに進むことができますが、ほとんどのシナリオでは必要ありません。挿入を実行し、更新ロジックの直後に更新を実行する場合は、挿入が完了するまで評価しないでください。ただし、さらに追加したい場合は、それらの間に「GO」を入力するだけで、次のことが可能になります。間違いない。

于 2013-02-11T15:22:16.423 に答える
1

複数のステートメントがあり、それらすべてが完了していること、またはいずれも完了していないことを確認したい場合は、トランザクションを使用する必要があります。挿入または更新ステートメントが失敗する理由はたくさんあるので、確認することをお勧めします。

BEGIN TRANSACTIONステートメントの前と後に使用COMMIT TRANSACTIONします。これまでにバッチで行った作業をキャンセルしたい場合は、を呼び出すこともできますROLLBACK TRANSACTION

これらのステートメントをTRY/CATCHブロックでラップして、エラーを適切に処理しようとします。

BEGIN TRY
    BEGIN TRANSACTION
        --insert/update statements go here
    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;

    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;    
END CATCH
于 2013-02-11T15:21:51.193 に答える