THROW (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库

引发异常,并将执行转移到 TRY...CATCH 构造的 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,并且必须大于或等于 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

下面的示例说明如何使用带 FORMATMESSAGETHROW 函数来引发自定义错误消息。 该示例首先使用 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).

后续步骤

通过以下文章详细了解相关概念: