THROW (Transact-SQL)
适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics 分析平台系统 (PDW) Microsoft Fabric 中的 SQL 分析端点 Microsoft Fabric 中的仓库
引发异常并将执行传输到 CATCH
TRY 的 块...CATCH 构造。
语法
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 之间的差异
下表列出了 RAISERROR 和THROW
语句之间的差异。
RAISERROR 语句 | THROW 语句 |
---|---|
如果传递给RAISERROR msg_id,则必须在中sys.messages 定义 ID。 |
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. 使用带 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).