分享方式:


THROW (Transact-SQL)

適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric 的 SQL 端點分析 Microsoft Fabric 的倉儲

引發例外狀況,並將執行傳送至 CATCH TRY 的 區塊...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

描述例外狀況的字串或變數。 訊息自變數為 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 之間的差異

下表列出 RAISERRORTHROW 語句之間的差異

RAISERROR 陳述式 THROW 陳述式
如果msg_id傳遞至 RAISERROR,則必須在 中sys.messages定義標識碼。 error_number 參數不需要在 中sys.messages定義。
msg_str參數可以包含printf格式化樣式。 訊息參數不接受printf樣式格式設定。
severity 參數指定例外狀況的嚴重性。 沒有 嚴重性 參數。 當 用來起始例外狀況時 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由於語句不允許在訊息參數中使用替代參數的方式RAISERRORFORMATMESSAGE因此函式會用來傳遞錯誤訊息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).