RAISERROR で飛ばそうとした場合、
CREATE PROCEDURE hogeProc;1 As
Go
create PROCEDURE hogeProc;2
As
begin try
begin try
RAISERROR ( 'Err From hoge2', [severity], 1 ) -- @@[severity]を書き換える
print 'hoge2 OK' + '(' + convert(varchar,isnull(error_number(), 0)) + ')'
end try
begin catch
print 'hoge2x Error'
print convert(varchar, error_number())+ ':' + error_message()
RAISERROR ( 'Err From hoge2x Catch', [severity], 1 ) -- @@[severity]を書き換える
end catch
end try
begin catch
print 'hoge2 Error'
print convert(varchar, error_number())+ ':' + error_message()
RAISERROR ( 'Err From hoge2 Catch', [severity], 1 ) -- @@[severity]を書き換える
end catch
Go
alter PROCEDURE hogeProc;1
As
begin try
exec hogeProc;2
RAISERROR ( 'Err From hoge1', [severity], 1 ) -- @@[severity]を書き換える
print 'hoge1 OK' + '(' + convert(varchar,isnull(error_number(), 0)) + ')'
end try
begin catch
print 'hoge1 Error'
print convert(varchar, error_number())+ ':' + error_message()
RAISERROR ( 'Err From hoge1 catch', [severity], 1 ) -- @@[severity]を書き換える
end catch
Go
この場合も注意が必要。
[severity] の値(数値)によって処理が違い、
0 の時はメッセージを表示するだけ(printと同じ?)で処理は続行(次行へ)
1~10 の時は、エラー形式で表示するが、やはり処理は続行(次行へ)
11~18 の時に、ようやく処理が1つ外側の catchブロックへ飛ぶ(外側になければ SQLServerのエラーになる)
(19以上は、実行に特別な権限が必要なので、あえて書くまい)
うーん。どっかでハマりそうな……