T-SQLで問題が発生した場合は、ユーザーの混乱を最小限に抑えて、問題をすばやく修正する必要があります。 SQL Serverで生成されたエラーメッセージは非常に技術的で理解しにくいため、問題の特定が困難になり、解決時間が遅くなる可能性があります。幸い、DBAはSQLServerエラーメッセージの代わりにSQLServerRAISERRORを実装できます。
RAISERRORは、エラーメッセージを生成し、エラー処理を開始するSQLServerエラー処理ステートメントです。 RAISERRORは、sys.messagesカタログビューに格納されているユーザー定義メッセージを参照することも、メッセージを動的に作成することもできます。メッセージは、サーバーエラーメッセージとして、呼び出し元のアプリケーションまたはTRY...CATCH構造の関連するCATCHブロックに返されます。
RAISERRORステートメントを使用するのが適切なシナリオはいくつかあります。
- Transact-SQLコードのトラブルシューティング
- 可変テキストを含むメッセージを返す
- データ値の調査
- TRYブロックから関連するCATCHブロックにジャンプしたり、CATCHブロックから呼び出し元にエラー情報を返したりするために実行が必要な場合
新しいアプリケーションを開発する場合、エラー処理ではRAISERRORよりもTHROWステートメントの方が適していることに注意してください。しかし、それについては後で詳しく説明します。
SQLServerのエラー処理にRAISERRORを使用する理由
SQLServerで生成されたエラー処理ではなくRAISERRORを選択する主な理由は2つあります。
- RAISERRORメッセージは、重大度と状態のレベルに関してカスタマイズ可能です
- わかりやすい自然言語で書くことができます
RAISERRORは、SQLServerデータベースエンジンによって生成されるのと同じ形式でエラーメッセージをアプリケーションに返します。これにより、開発者は独自のエラーメッセージを生成できるため、SQL Serverの技術的なエラーメッセージを解読しようとする代わりに、メッセージを読んでいる人は誰でも実際の問題が何であるかを理解できます。開発者は、独自の重大度レベル、メッセージID、およびエラーメッセージの状態を設定することもできます。
TRY...CATCHコンストラクトでのRAISERRORの使用
TRY ... CATCHは、TRYセクションでコードを実行し、CATCHセクションでエラーを処理できるようにするエラー処理構造です。一般に、TRY ... CATCHは多くのT-SQLエラーを識別する効果的な方法ですが、いくつかの例外があります。
このチュートリアルでは、RAISERRORをTRY...CATCHと組み合わせて使用する方法の詳細なウォークスルーを提供します。作成者は、TRYブロック内でRAISERRORを使用して、実行を関連するCATCHブロックにジャンプさせる方法を示す例を使用します。 CATCHブロック内で、作成者はRAISERRORを使用してCATCHブロックを呼び出したエラー情報を返す方法を示します。出力には、メッセージID、重大度のレベル、およびエラー状態が表示されます。
RAISERRORとTHROWのエラー処理ステートメント
RAISERRORはSQLServer7.0で導入され、長年にわたってT-SQLエラーを処理する効果的な方法でした。ただし、新しいアプリを開発している場合は、RAISERRORの代わりにTHROWステートメントを使用することをお勧めします。
組織がSQLServer2012以降に更新すると、RAISERRORは段階的に廃止されます。実際、RAISERRORは、SQLServer2014のネイティブにコンパイルされたストアドプロシージャでは使用できません。 THROWは使いやすいため、RAISERRORよりも改善されていると見なされます。
MicrosoftのSQLServerドキュメントでは、RAISERRORとTHROWのエラー処理ステートメントの違いを次のように分類しています。
RAISERRORステートメント
- msg_idがRAISERRORに渡される場合、IDはsys.messagesで定義する必要があります。
- msg_strパラメーターにはprintfフォーマットスタイルを含めることができます。
重大度パラメーターは、例外の重大度を指定します。
THROWステートメント
- error_numberパラメーターをsys.messagesで定義する必要はありません。
- メッセージパラメータはprintfスタイルのフォーマットを受け入れません。
- 重大度パラメーターはありません。例外の重大度は常に16に設定されます。
RAISERRORの日数は数えられるかもしれませんが、古いバージョンのSQLServerでは実行可能なエラー処理オプションのままです。 Microsoftは、新しいバージョンのSQL Server(SQL SERVER 2012以降)のユーザーに、エラー処理を実装するためにRAISERRORの代わりにTHROWステートメントを使用するように促しています。 MicrosoftはまだRAISERRORの廃止を発表していませんが、遅くなるよりも早くなる可能性があります。