TRY ... CATCHを使用してSQL Serverエラーを処理するためのステップバイステップガイド

実行を中断することなくエラーを特定する

Transact- SQLのTRY ... CATCH文は、データベースアプリケーションのエラー状態を検出して処理します。 このステートメントは、SQL Serverのエラー処理の基本であり、堅牢なデータベースアプリケーションを開発する上で重要な部分です。 TRY ... CATCHは、2008年以降のSQL Server、Azure SQLデータベース、Azure SQLデータウェアハウス、およびパラレルデータウェアハウスに適用されます。

TRY..CATCHの紹介

TRY ... CATCHは、2つのTransact-SQLステートメントを指定できます.1つは「試行」し、もう1つは発生する可能性のあるエラーを「キャッチ」するために使用します。 SQL ServerがTRY ... CATCHステートメントを検出すると、TRY句に含まれるステートメントがすぐに実行されます。 TRYステートメントが正常に実行されると、SQL Serverは単に移動します。 ただし、TRYステートメントでエラーが発生した場合、SQL ServerはCATCHステートメントを実行してエラーを正常に処理します。

基本的な構文は次の形式をとります:

BEGIN TRY {sql_statement | statement_block} END TRY BEGINキャッチ[{sql_statement | statement_block}] END CATCH [; ]

TRY ... CATCHの例

例を使用してこのステートメントの使用を理解するのが最も簡単です。 組織内の各従業員に関する情報を含む「従業員」という名前の表が含まれている人事データベースの管理者であるとします。 このテーブルでは、従業員の整数ID番号がプライマリキーとして使用されます 。 新しい従業員をデータベースに挿入するには、次のステートメントを使用します。

INSERT INTO employees(ID、first_name、last_name、extension)VALUES(12497、 'Mike'、 'C​​happle'、4201)

通常、この文はEmployeesテーブルに行を追加します。 ただし、ID 12497の従業員がデータベースにすでに存在する場合は、行を挿入すると主キー制約に違反し、次のエラーが発生します。

メッセージ2627、レベル14、状態1、行1 PRIMARY KEY制約 'PK_employee_id'の違反。 オブジェクト 'dbo.employees'に重複キーを挿入できません。 ステートメントは終了されました。

このエラーは、問題のトラブルシューティングに必要な情報を提供しますが、2つの問題があります。 まず、そのメッセージは秘密です。 エラーコード、行番号、および平均的なユーザーにとって理解不能なその他の情報が含まれています。 もう1つ重要なことは、ステートメントが中止され、アプリケーションがクラッシュする可能性があることです。

もう1つの方法は、次のようにTRY ... CATCH文で文をラップすることです。

(12497、 'Mike'、 'C​​happle'、4201)END TRY BEGIN CATCH PRINT 'エラー:' + ERROR_MESSAGE(); EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Employee Mail'、@recipients = 'hr@foo.com'、@body = '新しい従業員レコードの作成中にエラーが発生しました。'、@subject = 'Employee ID Duplication Error'; エンドキャッチ

この例では、発生したエラーは、コマンドを実行するユーザーとhr@foo.com電子メールアドレスの両方に報告されます。 ユーザーに表示されるエラーは次のようになります。

エラー:PRIMARY KEY制約 'PK_employee_id'に違反しています。 オブジェクト 'dbo.employees'に重複キーを挿入できません。 メールはキューに入れられました。

最も重要なのは、アプリケーションの実行が正常に継続され、プログラマが正常にエラーを処理できることです。 TRY ... CATCHステートメントを使用すると、SQL Serverデータベースアプリケーションで発生するエラーを事前に検出して処理するための洗練された方法です。

もっと学ぶ

Structured Query Languageの詳細については、「 SQL入門」を参照してください