【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
留意事項
- TRY CATCH 構造は一つのストアド、トリガなどに含めなければならず、CATCHだけ別のバッチ処理にいれるということはできない
- TRY ブロックの直後に CATCH ブロックを書く
- ERROR には「重大度」が判定され、重大度10以下は情報メッセージ/警告とみなされTRY - CATCH 処理されない
※重大度判定はあえてここで説明しませんがERROR の重要性を表す数値です。また、ERRORをCATCH した場合エラーメッセージが戻されます。
◇特徴
- TRY ブロックでエラーなく処理ロジックが完了した場合、END CATCHステートメント直後の処理が実行される
- .Net ではCATCH するERROR EXPRESSION を識別するクラス定義があるがTSQL はない
- 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 を簡単に説明してきた。
テクニカルに使う際にはもっとノウハウがあると思うが、そういった点についても後に触れていこうと思う。