SQLの動きを「見える化」!PRINTとRAISERRORを使ったデバッグ・エラー通知の基本
SQL Serverの開発や運用では、ストアドプロシージャやスクリプトの動作を
確認したり、エラー発生時にメッセージを出力したりする機会が多くあります。
その際によく使われるのがPRINTとRAISERRORです。
この記事では、両者の違い・使い方・実務での活用パターンを
初心者にもわかりやすく解説します。
目次
PRINTとRAISERRORの違いを理解する
用途と出力先の違い
| 項目 | RAISERROR | |
|---|---|---|
| 目的 | メッセージの表示(デバッグ・進捗確認) | エラー通知・例外発生 |
| 出力先 | メッセージウィンドウ | エラーメッセージ(TRY...CATCHで捕捉可) |
| 処理の継続 | 続行される | 重大度により中断または継続 |
| 主な用途 | ログ表示・デバッグ出力 | エラー制御・例外スロー |
PRINTは単純な出力、RAISERRORは例外処理やログ制御に利用されます。
PRINT文の使い方と注意点
基本構文
PRINT '処理を開始します。';
変数を含む出力
DECLARE @Count INT = 10;
PRINT '件数:' + CAST(@Count AS NVARCHAR(10));
注意点
- 出力文字数の上限は 8,000文字(nvarcharの場合4,000)
- バッチ処理中は遅れて出力されることがある(即時性は低い)
進捗やデバッグログを出す程度にとどめるのが実務的です。
RAISERROR文の基本構文と使い方
基本構文
RAISERROR ('エラーメッセージ', 16, 1);
第1引数はメッセージ内容、第2引数は重大度、第3引数は状態番号です。
変数を利用する例
DECLARE @Name NVARCHAR(50) = 'Taro';
RAISERROR ('ユーザー %s が存在しません。', 16, 1, @Name);
フォーマット指定子(%s, %dなど)を利用できます。
RAISERRORの重大度とWITH句オプション
重大度レベル(Severity)
| レベル | 意味 | 動作 |
|---|---|---|
| 0〜10 | 情報/警告 | 処理は継続 |
| 11〜16 | ユーザー定義エラー(一般的) | TRY...CATCHで捕捉可能 |
| 17〜25 | 致命的エラー | 接続が切断される可能性あり |
WITH句のオプション
RAISERROR ('重要な警告', 16, 1) WITH NOWAIT;
- NOWAIT: 即時出力
- LOG: SQL Serverエラーログに記録
- SETERROR: @@ERROR に値を設定
TRY...CATCHとの組み合わせとエラーログ出力
TRY...CATCHで例外を制御
BEGIN TRY
-- 例:0除算エラー
DECLARE @x INT = 1 / 0;
END TRY
BEGIN CATCH
DECLARE @ErrMsg NVARCHAR(4000) = ERROR_MESSAGE();
RAISERROR ('処理中にエラー: %s', 16, 1, @ErrMsg);
END CATCH;
エラーログへの記録例
RAISERROR ('致命的エラーが発生しました。', 20, 1) WITH LOG;
「WITH LOG」を付与すると、WindowsイベントログやSQL Serverエラーログにも記録されます。
PRINTとRAISERRORの使い分け方
| 用途 | RAISERROR | |
|---|---|---|
| 進捗やデバッグ表示 | ◎ | △ |
| エラー通知・ログ記録 | × | ◎ |
| TRY...CATCH連携 | × | ◎ |
| 処理継続性 | 常に続行 | 重大度により中断 |
基本的には「確認用=PRINT」「制御・通知用=RAISERROR」と覚えましょう。
まとめと次のステップ
学んだ内容の整理
- PRINTは開発・デバッグ向けの簡易出力。
- RAISERRORはエラー制御・ログ出力に利用する。
- TRY...CATCHと組み合わせることで柔軟なエラーハンドリングが可能。
- WITH LOG / NOWAIT などのオプションで出力タイミングや保存先を制御できる。
SQL Server学習シリーズ
参考リンク

0 件のコメント:
コメントを投稿