THROW (Transact-SQL)
适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库
引发异常,并将执行转移到 TRY...CATCH 构造的 CATCH 块。
语法
THROW [ { error_number | @local_variable },
{ message | @local_variable },
{ state | @local_variable } ]
[ ; ]
注意
若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档。
参数
error_number
表示异常的常量或变量。 error_number 为 int,并且必须大于或等于 50000 且小于或等于 2147483647 。
message
描述异常的字符串或变量。 message 为 nvarchar(2048) 。
State
在 0 到 255 之间的常量或变量,指示与消息关联的状态。 state 为 tinyint 。
备注
THROW 语句前的语句必须后跟分号 (;) 语句终止符。
如果 TRY…CATCH 构造不可用,则语句批处理将终止。 设置引发异常的行号和过程。 将严重性设置为 16。
如果指定 THROW 语句时未使用任何参数,该语句必须出现在 CATCH 块内。 这将导致引发已捕获异常。 THROW 语句中出现任何错误都将导致语句批处理终止。
% 是 THROW 语句的消息文本中的保留的字符,必须对其进行转义。 重复 % 字符以将 % 作为消息文本的一部分返回,例如“增加超出了 15%% 的原始值”。
RAISERROR 与 THROW 之间的差异
下表列出了 RAISERROR 和 THROW 语句之间的一些差异。
RAISERROR 语句 | THROW 语句 |
---|---|
如果将 msg_id 传递给 RAISERROR,则必须在 sys.messages 中定义 ID 。 | 无需在 sys.messages 中定义 error_number 参数 。 |
msg_str 参数可以包含 printf 格式设置样式 。 | message 参数不接受 printf 样式的格式设置 。 |
severity 参数指定异常的严重性 。 | 没有 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 那样替换 message 参数中的参数,因此使用 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).
后续步骤
通过以下文章详细了解相关概念:
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈