1. ホーム
  2. データベース
  3. mssql2005

SQL ServerにおけるRAISERRORの使用詳細

2022-01-09 22:08:05

 SQL Server における RAISERROR の使用法

raiserror が行うこと: raiserror は、エラーをスローするために使用されます。 . [以下の情報は、sql server 2005のヘルプから引用しています ]。

構文は以下の通りです。

RAISERROR ( { msg_id | msg_str | @local_variable }    
      { ,severity ,state }    
      [ ,argument [ ,. .n ] ] 
     )    
  [ WITH option [ ,. .n ] ]


おさらいすると

  最初のパラメータ: { msg_id | msg_str | @local_variable }.

      msg_id: sys.messages テーブルで定義されているメッセージ・デシグネータである可能性があることを示します。
              sp_addmessage を使用して、ユーザー定義のエラーメッセージ番号を sys.messages ディレクトリ ビューに格納します。
              ユーザー定義エラーメッセージのエラー番号は、50,000より大きい必要があります。

     msg_str: ユーザー定義メッセージである可能性もあり、エラーメッセージの長さは最大2047文字であることを示す。
             (定数の場合、nvarcharなのでN'xxxx'を使用)
              msg_str が指定された場合、RAISERROR はエラー番号 5000 のエラーメッセージを発生します。

     local_variable: msg_str の要領で整形された文字列変数にすることもできることを示します。           

第2パラメータ:厳しさ

           このメッセージに関連するユーザ定義の重要度レベル。(これは重要です)
            どのユーザーも0から18の間で深刻度を指定することができます。
            キャッチにジャンプしない[0,10]の閉じた区間。
            が [11,19] であれば、catch にジャンプする。
            20,無限大)であれば、データベース接続を直接終了させます。

第3パラメータ:state

            同じユーザー定義エラーが複数箇所で発生した場合は
            各ロケーションで一意のステータス番号を使用すると、エラーを発生させたセグメントを見つけるのに役立ちます。
            1から127までの任意の整数。(状態のデフォルトは1)
            状態値が0または127より大きい場合、エラーを発生させる!

第4引数:argument

            msg_str の代わりに使用するパラメータ、または msg_id に対応するメッセージ内の定義された変数。

第5パラメータ:option

            エラーのカスタムオプション。以下の表の値のいずれかを指定します。
            LOG : エラーログとアプリケーションログにエラーを記録します。
            NOWAIT : メッセージを即座にクライアントに送信します。
            SETERROR: @@ERROR値とERROR_NUMBER値をmsg_idまたは50000に設定します。

SQL]コードの例

--例1

DECLARE @raiseErrorCode nvarchar(50)
SET @raiseErrorCode = CONVERT(nvarchar(50), YOUR UNIQUEIDENTIFIER KEY)
RAISERROR('%s INVALID ID. There is no record in table',16,1, @raiseErrorCode)
 

--例2

RAISERROR (
       N'This is message %s %d.', -- Message text,
       10, -- Severity,
       1, -- State,
       N'number', -- First argument.
       5 -- Second argument.
     ); 
-- The message text returned is: This is message number 5.
GO


--例3

RAISERROR (N'<<%*. *s>>', -- Message text.
      10, -- Severity,
      1, -- State,
      7, -- First argument used for width.
      3, -- Second argument used for precision.
      N'abcde'); -- Third argument supplies the string.
-- The message text returned is: << abc>>.
GO


--例4

RAISERROR (N'<<%7.3s>>', -- Message text.
      10, -- Severity,
      1, -- State,
      N'abcde'); -- First argument supplies the string.
-- The message text returned is: << abc>>.
GO


--例5   

--A. CATCHブロックからエラーメッセージを返す

次のコード例では、TRY ブロックで RAISERROR を使用して、関連する CATCH ブロックに実行をジャンプさせる方法を示しています。
また、RAISERROR を使用して、CATCH ブロックを呼び出したエラーに関する情報を返す方法も示しています。

BEGIN TRY
  RAISERROR ('Error raised in TRY block.', -- Message text.
        16, -- Severity.
        1 -- State.
        );
END TRY
BEGIN CATCH
  DECLARE @ErrorMessage NVARCHAR(4000);
  DECLARE @ErrorSeverity INT;
  DECLARE @ErrorState INT;

  SELECT 
    @ErrorMessage = ERROR_MESSAGE(),
    @ErrorSeverity = ERROR_SEVERITY(),
    @ErrorState = ERROR_STATE();

  RAISERROR (@ErrorMessage, -- Message text.
        @ErrorSeverity, -- Severity.
        @ErrorState -- State.
        );
END CATCH;



--例6

--B. sys.messagesにライブメッセージを作成する
次の例は、sys.messages ディレクトリビューに格納されたメッセージをトリガーする方法を示しています。
メッセージ番号50005のメッセージをsp_addmessageシステムプロシージャでsys.messageディレクトリビューに追加します。

sp_addmessage @msgnum = 50005,
        @severity = 10,
        @msgtext = N'<<%7.3s>>';
GO

RAISERROR (50005, -- Message id.
      10, -- Severity,
      1, -- State,
      N'abcde'); -- First argument supplies the string.
-- The message text returned is: << abc>>.
GO

sp_dropmessage @msgnum = 50005;
GO



--例7

--C. メッセージテキストを提供するためにローカル変数を使用する
次のコード例は、RAISERROR 文のメッセージテキストを提供するためにローカル変数を使用する方法を示しています。

sp_addmessage @msgnum = 50005,
       @severity = 10,
       @msgtext = N'<<%7.3s>>';
GO

RAISERROR (50005, -- Message id.
      10, -- Severity,
      1, -- State,
      N'abcde'); -- First argument supplies the string.
-- The message text returned is: << abc>>.
GO

sp_dropmessage @msgnum = 50005;
GO



お読みいただきありがとうございます。お役に立てれば幸いです。また、このサイトを支持していただきありがとうございます