MSDNには、次の構文が記載されています。
RAISERROR ( { msg_id | msg_str | @local_variable }
{ ,severity ,state }
[ ,argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]
はmsg_str
最大 2047 文字の文字列を想定していますが、それより長い文字列は切り捨てられます。また、値によって提供される文字数を超えてメッセージを切り捨てるパラメーターを置き換える可能性もあります。
エラー メッセージは最大 2,047 文字です。メッセージに 2,048 文字以上が含まれる場合、最初の 2,044 文字のみが表示され、メッセージが切り捨てられたことを示す省略記号が追加されます。内部ストレージの動作により、置換パラメーターは出力に示されるよりも多くの文字を消費することに注意してください。たとえば、値 2 が割り当てられた %d の置換パラメーターは、実際にはメッセージ文字列内に 1 文字を生成しますが、内部的にさらに 3 文字のストレージを使用します。このストレージ要件により、メッセージ出力に使用できる文字数が減少します。msg_str が指定されている場合、RAISERROR はエラー番号 50000 のエラー メッセージを生成します。
はseverity
0 ~ 25 の数値を想定していますが、他の数値を修正します。
0 から 18 までの重大度レベルは、すべてのユーザーが指定できます。19 ~ 25 の重大度レベルは、sysadmin 固定サーバー ロールのメンバー、または ALTER TRACE 権限を持つユーザーのみが指定できます。19 から 25 までの重大度レベルでは、WITH LOG オプションが必要です。0 未満の重大度レベルは 0 として解釈されます。25 を超える重大度レベルは 25 として解釈されます。
は 0 ~ 255の値を想定していますが、ゼロ以下のstate
値を修正します。
[state] は 0 ~ 255 の整数です。負の値のデフォルトは 1 です。255 より大きい値は使用しないでください。
問題
これらのクエリを実行すると、次のエラーが発生します。
RAISEERROR('Test', 20, 1);
メッセージ 102、レベル 15、状態 1、行 1
「Test」付近の構文が正しくありません。
DECLARE @err_message nvarchar(255);
SET @err_message = 'Test';
RAISEERROR(@err_message, 20, 1);
メッセージ 102、レベル 15、状態 1、行 3
「RAISEERROR」付近の構文が正しくありません。
他のさまざまなクエリを問題なく実行できます。例えば:
THROW 50001, 'Test', 1;
メッセージ 50001、レベル 16、状態 1、行 1
テスト
より詳しい情報
SELECT @@VERSION
これを生成します:
Microsoft SQL Server 2016 (RTM-GDR) (KB3194716) - 13.0.1722.0 (X64) Sep 26 2016 13:17:23 Copyright (c) Microsoft Corporation Express Edition (64-bit) on Windows 8.1 Pro 6.3 (Build 9600: )
また、MSDN の構文は「SQL Server (2008 年以降)October 19, 2016
」用であり、記事を書いている時点では、私が実行している SQL Server バージョンのリリースから数か月後に記事が更新されました。
何が起きてる?