THROW (Transact-SQL)
適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウス
例外を発生させ、TRY のブロックに CATCH
実行を 転送します。...CATCH コンストラクト。
構文
THROW [ { error_number | @local_variable }
, { message | @local_variable }
, { state | @local_variable } ]
[ ; ]
Note
SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。
引数
error_number
例外を表す定数または変数。 error_number引数は int で、50,000 以上、2,147,483,647 以下である必要があります。
message
例外を記述する文字列または変数。 メッセージ引数は nvarchar(2048) です。
state
メッセージに関連付ける状態を示す 0 から 255 までの定数または変数。 状態引数は tinyint です。
解説
ステートメントの前のステートメントの THROW
後にセミコロン (;
) ステートメント ターミネータを付ける必要があります。
コンストラクトが TRY...CATCH
使用できない場合、ステートメント バッチは終了します。 例外が発生する行番号およびプロシージャが設定されます。 重大度は 〝 に 16
設定されます。
パラメーターを THROW
指定せずにステートメントを指定する場合は、ブロック内に記述する CATCH
必要があります。 これによりキャッチされた例外が発生します。 ステートメントで THROW
エラーが発生すると、ステートメント バッチが終了します。
%
は、ステートメントのメッセージ テキスト内の THROW
予約文字であり、エスケープする必要があります。 %
たとえば'The increase exceeded 15%% of the original value'
、メッセージ テキストの一部として返す%
文字を 2 倍にします。
RAI Standard Edition RROR と THROW の違い
次の表に、RAI Standard Edition RROR とTHROW
ステートメントの違いを示します。
RAISERROR ステートメント | THROW ステートメント |
---|---|
msg_idが渡されるRAISERROR 場合、ID sys.messages は . |
error_number パラメーターを定義sys.messages する必要はありません。 |
msg_str パラメーターには書式設定スタイルを含printf めることができます。 |
メッセージ パラメーターは、スタイルの書式設定を受け入れprintf られません。 |
severity パラメーターでは例外の重大度を指定します。 | 重大度パラメーターはありません。 例外の開始に使用される場合 THROW 、重大度は常に 16 . ただし、既存の例外を再スローするために使用すると THROW 、重大度はその例外の重大度レベルに設定されます。 |
Standard Edition T XACT_ABORTを優先しません。 | トランザクションは、Standard Edition T XACT_ABORTが ON . |
例
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
このステートメントではメッセージ パラメーター内の置換パラメーターRAISERROR
を使用できないため、FORMATMESSAGE
エラー メッセージ 60000 で予期される 3 つのパラメーター値を渡すために関数が使用されます。
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).
関連するコンテンツ
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示