エラーをキャッチするためのサンプルコード
BEGIN TRY
EXECUTE Abc
END TRY
BEGIN CATCH
print 'Error got'
SELECT
ERROR_NUMBER() as ErrorNumber,
ERROR_MESSAGE() as ErrorMessage;
END CATCH;
次のことを行うと、これは機能しません。
CREATE PROC test
AS
BEGIN TRY
SELECT * FROM NonexistentTable
END TRY
BEGIN CATCH
-- some code
END CATCH
これが機能する唯一の方法は、1つのストアドプロシージャが次のような別のストアドプロシージャを呼び出す場合です。
CREATE PROC Test
AS
SELECT * FROM NonexistentTable
GO
CREATE PROC test2
AS
BEGIN TRY
EXECUTE Test
END TRY
BEGIN CATCH
-- some code
END CATCH
GO
TRY…CATCHコンストラクトは、次の条件をトラップしません。
重大度が10以下の警告または情報メッセージ。
セッションのSQLServerデータベースエンジンタスク処理を停止する重大度が20以上のエラー。重大度が20以上のエラーが発生し、データベース接続が中断されていない場合、TRY…CATCHがエラーを処理します。
クライアントの中断要求やクライアント接続の切断などの注意。
システム管理者がKILLステートメントを使用してセッションを終了したとき。
次のタイプのエラーは、TRY…CATCHコンストラクトと同じ実行レベルで発生した場合、CATCHブロックによって処理されません。
- バッチの実行を妨げる構文エラーなどのコンパイルエラー。
- 名前解決が延期されたためにコンパイル後に発生するオブジェクト名解決エラーなど、ステートメントレベルの再コンパイル中に発生するエラー。