データを変更するためにいくつかのコマンドを実行するストアドプロシージャを作成しました。すべてが成功した場合にのみトランザクションをコミットしたいと思います。私は以下の方法でtry-catchブロックを使用してこれを行っています(実際のCATCHブロックはRAISERRORを使用してエラーメッセージを返します):
BEGIN TRY
BEGIN TRANSACTION
UPDATE Table1 SET MyVarcharColumn = 'test'
UPDATE Table2 SET MyBitColumn = 1
UPDATE Table3 SET MyIntColumn = 42
COMMIT TRANSACTION
END TRY
CATCH
ROLLBACK TRANSACTION
END CATCH
それは私が望むように機能します。たとえば、MyBitColumnを1ではなく'b'に設定すると、エラーがキャッチされ、制御がCATCHに流れ、トランザクションはコミットされません。
私が気付いた問題の1つは、たとえば、Table3がデータベースに存在しない場合、エラーが発生する(オブジェクト名が無効)が、CATCHブロックが実行されず、トランザクションが開いたままになることです。
これを処理して、データベースが変更される(またはこのストアドプロシージャが適切に追加されているが、テーブルの1つが変更されていない)可能性を処理したいと思います。
これらのエラーケースをどのように処理する必要がありますか?
-助けてくれてありがとう。