2007.01.26

SQLServer 2005 の try-catch について(ついでに)

RAISERROR で飛ばそうとした場合、

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[hogeProc]') AND type in (N'P', N'PC')) DROP PROCEDURE [dbo].[hogeProc] Go

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以上は、実行に特別な権限が必要なので、あえて書くまい)

うーん。どっかでハマりそうな……

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

photo
ichikawa