次の方法で共有


THROW (Transact-SQL)

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric の SQL 分析エンドポイント Microsoft Fabric Warehouse Microsoft Fabric SQL Database

例外を発生させ、TRY..のCATCH ブロックに実行を転送します。CATCH コンストラクト。

Transact-SQL 構文表記規則

構文

THROW [ { error_number | @local_variable }
    , { message | @local_variable }
    , { state | @local_variable } ]
[ ; ]

引数

error_number

例外を表す定数または変数。 error_number引数は int で、50,000 以上 2,147,483,647 以下である必要があります。

message

例外を記述する文字列または変数。 message 引数は nvarchar(2048)です。

state

メッセージに関連付ける状態を示す 0 から 255 までの定数または変数。 state 引数は tinyint です。

解説

state を使用すると、ストアド プロシージャ、トリガー、またはステートメント バッチ内のエラーの原因を特定できます。 たとえば、同じメッセージを複数の場所で使用する場合、一意の state 値を使用すると、エラーが発生した場所を特定できます。

THROW ステートメントの前のステートメントの後にセミコロン (;) ステートメント ターミネータを付ける必要があります。

TRY...CATCHコンストラクトを使用できない場合、ステートメント バッチは終了します。 例外が発生する行番号およびプロシージャが設定されます。 重大度は 16に設定されます。

パラメーターを指定せずに THROW ステートメントを指定する場合は、 CATCH ブロック内に記述する必要があります。 これによりキャッチされた例外が発生します。 THROW ステートメントで発生したエラーが発生すると、ステートメント バッチが終了します。

% は、 THROW ステートメントのメッセージ テキスト内の予約文字であり、エスケープする必要があります。 'The increase exceeded 15%% of the original value'など、メッセージ テキストの一部として%を返すには、%文字を 2 倍にします。

RAISERROR と THROW の違い

次の表に、 RAISERROR ステートメントと THROW ステートメントの違いを示します。

RAISERROR ステートメント THROW ステートメント
msg_idRAISERRORに渡される場合、ID はsys.messagesで定義する必要があります。 error_number パラメーターは、sys.messagesで定義する必要はありません。
msg_str パラメーターには、printf書式設定スタイルを含めることができます。 message パラメーターは、スタイルの書式設定printf受け入れられません。
severity パラメーターでは例外の重大度を指定します。 everity パラメーターはありません。 THROWを使用して例外を開始すると、重大度は常に16に設定されます。 ただし、 THROW を使用して既存の例外を再スローする場合、重大度はその例外の重大度レベルに設定されます。
SET XACT_ABORTを優先しません。 SET XACT_ABORTONされている場合トランザクションはに戻されます。

A. THROW を使用して例外を発生させる

次の例では、THROW ステートメントを使用して例外を発生させる方法を示します。

THROW 51000, 'The record does not exist.', 1;

結果セットは次のとおりです。

Msg 51000, Level 16, State 1, Line 1
The record does not exist.

B. THROW を使用して例外を再度発生させる

次の例では、THROW ステートメントを使用して最後にスローされた例外を再度発生させる方法を示します。

USE tempdb;
GO
CREATE TABLE dbo.TestRethrow
(    ID INT PRIMARY KEY
);
BEGIN TRY
    INSERT dbo.TestRethrow(ID) VALUES(1);

--  Force error 2627, Violation of PRIMARY KEY constraint to be raised.
    INSERT dbo.TestRethrow(ID) VALUES(1);
END TRY
BEGIN CATCH

    PRINT 'In catch block.';
    THROW;
END CATCH;

結果セットは次のとおりです。

In catch block.
Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint 'PK__TestReth__3214EC272E3BD7D3'. Cannot insert duplicate key in object 'dbo.TestRethrow'.
The statement has been terminated.

C: FORMATMESSAGE を THROW と共に使用する

次の例では、 FORMATMESSAGE 関数を THROW と共に使用して、カスタマイズされたエラー メッセージをスローする方法を示します。 この例では、まず、sp_addmessage を使用して、ユーザー定義のエラー メッセージを作成します。 THROW ステートメントでは、messageパラメーターの置換パラメーターはRAISERRORの方法では許可されないため、エラー メッセージ 60000で予期される 3 つのパラメーター値を渡すために、FORMATMESSAGE関数が使用されます。

EXEC sys.sp_addmessage
    @msgnum = 60000,
    @severity = 16,
    @msgtext = N'This is a test message with one numeric parameter (%d), one string parameter (%s), and another string parameter (%s).',
    @lang = 'us_english';
GO

DECLARE @msg NVARCHAR(2048) = FORMATMESSAGE(60000, 500, N'First string', N'second string');

THROW 60000, @msg, 1;

結果セットは次のとおりです。

Msg 60000, Level 16, State 1, Line 2
This is a test message with one numeric parameter (`500`), one string parameter (First string), and another string parameter (second string).