THROW (Transact-SQL)
適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW) SQL 分析端點在 Microsoft Fabric SQL 資料庫中Microsoft網狀架構倉儲中的 SQL 分析端點Microsoft網狀架構
引發例外狀況,並將執行傳送至 CATCH
TRY 的 區塊...CATCH 建構。
語法
THROW [ { error_number | @local_variable }
, { message | @local_variable }
, { state | @local_variable } ]
[ ; ]
引數
error_number
代表例外狀況的常數或變數。 error_number自變數為 int,且必須大於或等於 50,000,且小於或等於 2,147,483,647。
message
描述例外狀況的字串或變數。 訊息自變數為 nvarchar(2048)。
state
介於 0 到 255 之間的常數或變數,表示要與訊息產生關聯的狀態。 state 自變數為 tinyint。
備註
使用 狀態 來協助您識別預存程式、觸發程式或語句批次中錯誤的來源。 例如,如果您在多個位置使用相同的訊息,唯 一的狀態 值可協助您找出發生錯誤的位置。
語句之前的 THROW
語句後面必須接著分號 (;
) 語句終止符。
TRY...CATCH
如果無法使用建構,語句批次就會終止。 系統會設定引發例外狀況的行號和程序。 嚴重性設定為 16
。
THROW
如果未指定 語句,則它必須出現在 區塊內CATCH
。 這會導致引發攔截到的例外狀況。 語句中 THROW
發生的任何錯誤都會終止語句批次。
%
是語句訊息正文 THROW
中的保留字元,必須逸出。 將 %
字元加倍傳回 %
做為消息正文的一部分,例如 'The increase exceeded 15%% of the original value'
。
RAISERROR 與 THROW 之間的差異
下表列出 RAISERROR 和 THROW
語句之間的差異。
RAISERROR 陳述式 | THROW 陳述式 |
---|---|
如果msg_id傳遞至 RAISERROR ,則必須在 中sys.messages 定義標識碼。 |
error_number 參數不需要在 中sys.messages 定義。 |
msg_str參數可以包含printf 格式化樣式。 |
訊息參數不接受printf 樣式格式設定。 |
severity 參數指定例外狀況的嚴重性。 | 沒有 嚴重性 參數。 當 用來起始例外狀況時 THROW ,嚴重性一律會設定為 16 。 不過,當 用來重新擲回現有例外狀況時 THROW ,嚴重性會設定為該例外狀況的嚴重性層級。 |
不接受 SET XACT_ABORT。 | 如果 SET 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
所預期的三個參數值。
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).