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ステートメントを実行します。
基本的な構文は次の形式をとります:
始める ステートメントブロック END TRYスタートキャッチsql_statementエンドキャッチ ; 例を使ってこのステートメントの使用を理解するのは簡単です。組織内の各従業員に関する情報を含む「従業員」という名前の表が含まれている人事データベースの管理者であるとします。このテーブルでは、従業員の整数ID番号がプライマリキーとして使用されます。新しい従業員をデータベースに挿入するには、次のステートメントを使用します。 INSERT INTOの従業員(id、first_name、last_name、extension)VALUES(12497、 'Mike'、 'Chapple'、4201)
通常、この文はEmployeesテーブルに行を追加します。ただし、ID 12497の従業員がデータベースにすでに存在する場合は、行を挿入すると主キー制約に違反し、次のエラーが発生します。 メッセージ2627、レベル14、状態1、行1PRIMARY KEY制約 'PK_employee_id'に違反しています。オブジェクト 'dbo.employees'に重複キーを挿入できません。ステートメントは終了されました。
このエラーは、問題のトラブルシューティングに必要な情報を提供しますが、2つの問題があります。まず、そのメッセージは秘密です。エラーコード、行番号、および平均的なユーザーに理解不能なその他の情報が含まれています。もう1つ重要なことは、ステートメントが中止され、アプリケーションがクラッシュする可能性があることです。もう1つの方法は、次のように、TRY … CATCHステートメントでステートメントをラップすることです。 始めるINSERT INTOの従業員(id、first_name、last_name、extension)VALUES(12497、 'Mike'、 'Chapple'、4201)END TRYスタートキャッチPRINT 'ERROR:' + ERROR_MESSAGE();EXEC msdb.dbo.sp_send_dbmail@profile_name = '従業員メール'、@recipients = '[email protected]'、@body = '新しい従業員レコードの作成中にエラーが発生しました。'、@subject = '従業員IDの重複エラー';エンドキャッチ
この例では、発生したエラーは、コマンドを実行するユーザーと[email protected]電子メールアドレスの両方に報告されます。ユーザーに表示されるエラーは次のとおりです。 エラー:PRIMARY KEY制約 'PK_employee_id'に違反しています。 オブジェクト 'dbo.employees'に重複キーを挿入できません。メールはキューに入れられました。
アプリケーションの実行は正常に継続され、プログラマはエラーを処理できます。 TRY … CATCHステートメントを使用すると、SQL Serverデータベースアプリケーションで発生するエラーを事前に検出して処理するための洗練された方法です。 Structured Query Languageの詳細については、Introduction to SQLを参照してください。 TRY … CATCHの例
もっと学ぶ




