SQL Try Catch 可帮助您有效处理查询错误。就像 Java 或 C# 中的异常处理一样,Microsoft Server 为我们提供了 TRY CATCH 结构。
例如,我们在 TRY 块中编写一系列语句。然后,如果服务器发现错误,它将退出 TRY 块并进入 CATCH 块;它将执行 CATCH 块中的语句。最后,它将返回相应的错误描述。
在开始使用 SQL Try catch 之前,您需要记住以下几点。
- CATCH 块必须紧跟在每个 TRY 块之后。您不允许在 END TRY 和 BEGIN CATCH 之间包含任何语句。
- 如果 TRY 块中没有错误,控制将不会进入 CATCH 块。这意味着控制器将执行 END CATCH 之后的语句。
- 如果 TRY 块中发生错误,它将立即退出 Try 块并进入 Catch 块。
- TRY CATCH 将捕获所有严重性大于 10 且小于 20 的错误。
- 它允许您使用嵌套 TRY 块(TRY CATCH 嵌套在另一个 TRY CATCH 中)。
- 但是,CATCH 块无法处理编译错误,例如语法错误。
SQL Server TRY CATCH 语法
Try Catch 的语法如下所示。
BEGIN TRY
-- Statements;
END TRY
BEGIN CATCH
-- Statements;
END CATCH
在 Catch 块中,使用以下系统函数来获取有关错误的信息。
- ERROR_MESSAGE():返回错误的完整描述。例如,算术溢出等。
- ERROR_LINE():返回错误发生的行号。
- ERROR_NUMBER():返回错误编号。
- ERROR_SEVERITY():显示错误的严重性。
- ERROR_PROCEDURE():返回发生错误的触发器或存储过程的名称。
- ERROR_STATE():返回SQL Server错误的 state 编号。
SQL TRY CATCH 示例
在此 Try Catch 示例中,我们将计算 10/0 的结果。
BEGIN TRY
SELECT 10/0 AS Result;
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE() AS [Error Message]
,ERROR_LINE() AS ErrorLine
,ERROR_NUMBER() AS [Error Number]
,ERROR_SEVERITY() AS [Error Severity]
,ERROR_STATE() AS [Error State]
END CATCH

在 TRY 块中,我们计算 10/0 的结果。众所周知,任何数除以零都会出错。一旦遇到错误,它将进入 CATCH 块。
SELECT 10/0 AS Result;
此 try catch 查询将返回状态、严重性、错误编号、错误发生的行以及解释错误的 message。
SELECT ERROR_MESSAGE() AS [Error Message]
,ERROR_LINE() AS ErrorLine
,ERROR_NUMBER() AS [Error Number]
,ERROR_SEVERITY() AS [Error Severity]
,ERROR_STATE() AS [Error State]
TRY CATCH 示例 2
在此示例中,我们展示了该过程的实际工作原理。在这里,我们使用不同的打印语句来显示 SQL TRY 和 Catch 块的开始和结束。
DECLARE @Number TINYINT,
@Result TINYINT
BEGIN TRY
PRINT N'This Message is From Start of the TRY BLOCK'
SET @Number = 254;
PRINT N'Value Stored in @Number Variable = ' + CAST(@Number AS VARCHAR)
SET @Result = @Number + 1;
PRINT N'This Message is From End of the TRY BLOCK'
SELECT @Number AS Number,
@Result AS Result;
END TRY
BEGIN CATCH
PRINT N'This Message is From Start of the CATCH BLOCK'
PRINT N'Error Message = ' + ERROR_MESSAGE()
PRINT N'Error Number = ' + CAST(ERROR_NUMBER() AS VARCHAR)
PRINT N'Error Line = ' + CAST(ERROR_LINE() AS VARCHAR)
PRINT N'This Message is From End of the CATCH BLOCK'
END CATCH
结果选项卡
Number | Result
---------------
254 | 255
让我检查 Message 选项卡

从上面的屏幕截图可以看到,它只打印了 SQL TRY 块中的语句。
SQL TRY CATCH 错误处理示例 3
如何使用 try catch 处理错误。这与前面的示例是相同的代码,但我们将 @Number 从 254 改为了 255。
DECLARE @Number TINYINT,
@Result TINYINT
BEGIN TRY
PRINT N'This Message is From Start of the TRY BLOCK'
SET @Number = 255;
PRINT N'Value Stored in @Number Variable = ' + CAST(@Number AS VARCHAR)
SET @Result = @Number + 1;
PRINT N'This Message is From End of the TRY BLOCK'
SELECT @Number AS Number,
@Result AS Result;
END TRY
BEGIN CATCH
PRINT N'This Message is From Start of the CATCH BLOCK'
PRINT N'Error Message = ' + ERROR_MESSAGE()
PRINT N'Error Number = ' + CAST(ERROR_NUMBER() AS VARCHAR)
PRINT N'Error Line = ' + CAST(ERROR_LINE() AS VARCHAR)
PRINT N'This Message is From End of the CATCH BLOCK'
END CATCH
在此 try catch 错误处理示例中,首先,我们声明了两个 tinyint 变量。
DECLARE @Number TINYINT, @Result TINYINT
接下来,在 TRY 块中,我们将 255 赋给了 Number 变量,并对 result 变量进行了加法运算。
PRINT N'This Message is From Start of the TRY BLOCK'
SET @Number = 255;
PRINT N'Value Stored in @Number Variable = ' + CAST(@Number AS VARCHAR)
SET @Result = @Number + 1;
PRINT N'This Message is From End of the TRY BLOCK'
众所周知,tiny int 的最大值为 255,意味着会发生溢出。因此,它将退出 TRY 块并执行我们 CATCH 块中的语句,该语句是:
PRINT N'This Message is From Start of the CATCH BLOCK'
PRINT N'Error Message = ' + ERROR_MESSAGE()
PRINT N'Error Number = ' + CAST(ERROR_NUMBER() AS VARCHAR)
PRINT N'Error Line = ' + CAST(ERROR_LINE() AS VARCHAR)
PRINT N'This Message is From End of the CATCH BLOCK'

如果您观察到上面的示例屏幕截图,尽管我们在 TRY 块的末尾有 print 语句,但控制器跳过了该语句。这是因为一旦进入 SET @Result = @Number + 1;,控制就会退出 TRY 块并立即进入 Catch 块。