あなたの質問に対する答えは、SET XACT_ABORT
によって異なります。
設定:
たとえば、次のコードを試してください。最初の 0 除算でエラーが発生しますが、実行は続行されます .ゼロによる 2 番目の除算はエラーを発生させ、実行を停止します:
begin transaction set xact_abort off select 1 / 0 -- causes divide by zero error, but continues select @@trancount -- returns 1 set xact_abort on select 1 / 0 -- causes divide by zero error and terminates execution select @@trancount -- we never get here rollback
プレ>XACT_ABORT が ON の場合、エラーによってトランザクションが中止され、TRY / CATCH は必要ありません。
XACT_ABORT が OFF の場合、各ステートメントのステータスをチェックして、エラーが発生したかどうかを確認する必要があります:
begin transaction delete from... if @@error <> 0 begin if @@trancount > 0 rollback return end insert into... if @@error <> 0 begin if @@trancount > 0 rollback return end commit
プレ>ただし、TRY / CATCH が必要なケースが見つかった場合は、エラーが発生したときに何か特別なことを行う必要がある場合があります。その場合は、例外処理を TRY / CATCH することを忘れないでください:
begin transaction set xact_abort on begin try select 1 / 0 -- causes divide by zero error and terminates execution select @@trancount -- we never get here commit end try begin catch select xact_state() -- this will be -1 indicating you MUST rollback before doing any other operations select @@trancount -- this will probably be one, because we haven't ended the transaction yet if xact_state() <> 0 begin try select 'rollback' rollback -- do something to handle or record the error before leaving the current scope select 'exception processing here' --insert into... end try begin catch -- ignore rollback errors end catch end catch
プレ>