あなたの質問への答えはSET XACT_ABORT
設定に依存します:
は、Transact-SQLステートメントは、実行時エラーが発生すると、SQL Serverは自動的に現在の トランザクションをロールバックするかどうかを指定します。
SET XACT_ABORTがONの場合、Transact-SQLステートメントで実行時エラー が発生すると、トランザクション全体が終了してロールバックされます。
SET XACT_ABORTがOFFの場合、エラーを発生させたTransact-SQL ステートメントのみがロールバックされ、トランザクション が処理を続行する場合があります。エラーの重大度に応じて、SET XACT_ABORTがオフであってもトランザクション全体がロールバックされることがあります( )。 デフォルト設定はOFFです。
構文エラーなどのコンパイルエラーは、SET XACT_ABORTの影響を受けません。
たとえば、次のコードを試してください。最初の0で除算するとエラーが発生しますが、は実行を続行します。ゼロによる2部では、エラー手を上げ、実行を一時的に停止させます。XACT_ABORTがONの場合
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
、その後のエラーは、トランザクションをアボートします、そしてあなたは、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
をしかし、あなたはあなたが/ 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