【SQL Server 2005 - ストアド】便利な TRY - CATCH

.Net でおなじみのTRY - CATCH と同様な機能がSQL Server 2005からTSQLに追加された。
TSQL ではBEGIN TRY - END TRY / BEGIN CATCH - END CATCH という記述で表現する。
今回はストアドプロシージャを作成するときに多く使われているこのTRY - CATCH の機能と特徴などについて書いてみる。

◇基本的な構文の形式

BEGIN TRY

(処理ロジック)

END TRY
BEGIN CATCH

(ERROR 処理ロジック)

END CATCH

留意事項

  1. TRY CATCH 構造は一つのストアド、トリガなどに含めなければならず、CATCHだけ別のバッチ処理にいれるということはできない
  2. TRY ブロックの直後に CATCH ブロックを書く
  3. ERROR には「重大度」が判定され、重大度10以下は情報メッセージ/警告とみなされTRY - CATCH 処理されない

※重大度判定はあえてここで説明しませんがERROR の重要性を表す数値です。また、ERRORをCATCH した場合エラーメッセージが戻されます。

◇特徴

  1. TRY ブロックでエラーなく処理ロジックが完了した場合、END CATCHステートメント直後の処理が実行される
  2. .Net ではCATCH するERROR EXPRESSION を識別するクラス定義があるがTSQL はない
  3. TRY - CATCH のネストは同じTRYブロック内/CATCH ブロック内に書くことができ、入れ子の中でTRY - CATCH 処理が行われる

TRY - CATCH に対応できないエラーとして「コンパイル時のエラー」や「オブジェクト名の遅延解決によるエラー」があり、これらのエラー時はTSQL が実行されずエラーメッセージだけが戻されるため、CATCH に書いた処理は実行されない。

CATCH が正常に動作する例
SELECT 1/0 を実行すると除算エラーが発生し処理が中断される。このときSELECT 'AAA' 実行後にCATCHされたことがわかる

TSQLが失敗し動作しなかった例
SELECT * FROM AAA 存在しないテーブルをSELECT した場合、TSQLそのものが実行されずエラーメッセージのみが返される

TSQL に実装されたTRY - CATCH を簡単に説明してきた。
テクニカルに使う際にはもっとノウハウがあると思うが、そういった点についても後に触れていこうと思う。