THROW (Transact-SQL)

适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics 分析平台系统 (PDW) Microsoft Fabric 中的 SQL 分析端点 Microsoft Fabric 中的仓库

引发异常并将执行传输到 CATCH TRY 的 块...CATCH 构造。

Transact-SQL 语法约定

语法

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

注意

若要查看 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'

RAISERROR 和 THROW 之间的差异

下表列出了 RAISERRORTHROW语句之间的差异

RAISERROR 语句 THROW 语句
如果传递给RAISERRORmsg_id,则必须在中sys.messages定义 ID。 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. 使用带 THROW 的 FORMATMESSAGE

以下示例演示如何使用 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).