いくつかのテーブルの挿入と更新がそれらの前の挿入に依存しているストアドプロシージャを作成しています。これらの操作を確実に終了させるために何かを行う必要がありますか(コミットなど)、またはストアドプロシージャ呼び出しへの挿入は常に順番に実行および完了され、何も心配していませんか?
2 に答える
何も心配する必要はありません。心配する必要がある唯一のシナリオは、永続テーブル(非一時/非可変テーブル)を作成し、後でそのテーブルに挿入する場合です。テーブルが存在しないことを示す実行時エラーを回避するには、テーブルの作成後、レコードの挿入前に「GO」を入力する必要があります。いつでも「GO」コマンドを使用して、その時点までのすべての手続き型コマンドが完了してから、その後のコードに進むことができますが、ほとんどのシナリオでは必要ありません。挿入を実行し、更新ロジックの直後に更新を実行する場合は、挿入が完了するまで評価しないでください。ただし、さらに追加したい場合は、それらの間に「GO」を入力するだけで、次のことが可能になります。間違いない。
複数のステートメントがあり、それらすべてが完了していること、またはいずれも完了していないことを確認したい場合は、トランザクションを使用する必要があります。挿入または更新ステートメントが失敗する理由はたくさんあるので、確認することをお勧めします。
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