处理 T-SQL 中的错误
介绍
Transact-SQL 语言具有多种错误处理功能。在本指南中,您将了解 T-SQL 错误处理的基础知识、故意引发错误以及如何在发生错误时发出警报。
在 SQL Server 中,错误可以由发生错误时的 SQL Server 引擎生成,也可以由自定义 T-SQL 代码生成。
错误类型
SQL Server 中的错误有两种类型:系统错误和自定义错误。系统错误可以在 sys.messages 系统视图中查看,由 SQL Server 定义。因此,当发生系统错误时,SQL Server 将记录系统错误,并可能采取措施修复错误。
另一方面,自定义错误是由 T-SQL 自定义代码根据您的代码或业务逻辑生成的。要将自定义错误消息添加到 sys.messages,请使用存储过程 sp_addmessage。
下面是添加自定义错误消息的示例:
EXEC sp_addmessage 50001, 16,
N'Unit price needs to be greater than 0'.
GO
在上面的示例中,50001 是消息 ID。此参数可以是 50,001 至 2,147,483,647 之间的整数。
16 是严重性,它是 smallint,范围从 1 到 25。
使用 RAISERROR 引发错误
RAISERROR 允许应用程序生成错误,然后调用进程可以捕获该错误。这使得应用程序中的错误处理更加容易,因为它像任何其他系统错误一样发送。因此,RAISERROR 可用于排除 T-SQL 代码故障、调试和检查变量的值,并根据变量数据返回有意义的错误消息。
下面是在 SQL Server 中使用 RAISERROR 的示例:
RAISERROR (N'This is message.', -- Message text.
10, -- Severity,
1); -- Second argument.
GO
输出结果如下:
这是消息。
使用 THROW 引发错误
THROW 语句是在 T-SQL 代码中引发错误的一种更简单的方法。
下面是在 SQL Server 中如何使用 THROW 的示例:
THROW
51000, -- error number
'This is not a valid value for unit price.', -- message
1; --state
GO
结果集如下:
Msg 51000, Level 16, State 1, Line 1
This is not a valid value for unit price.
在上面的例子中,51000 是错误编号。错误编号是一个整数,其值必须介于 50000 和 2147483647 之间。下一个参数是消息,它是一个包含错误描述的字符串。它的格式是 nvarchar(2048),最后是状态,它是一个介于 0 和 255 之间的常数。它显示与消息关联的状态。状态的类型为 tinyint。
理解 @@Error 变量
@@ERROR 是一个系统变量,用于保存发生的最后一个错误的错误号。使用 @@ERROR 的一个缺点是,它保存的值会随着每个附加语句的执行而重置。要获取最后一个错误号,请使用以下查询:
Select @@ERROR
使用 @@Error 的示例
请考虑下面的例子,在选择@@ERROR的值之前引发了自定义错误。
RAISERROR(N'Message', 16, 1);
IF @@ERROR <> 0
PRINT 'Error=' + CAST(@@ERROR AS VARCHAR(8));
GO
输出如下:
Msg 50000, Level 16, State 1, Line 1
Message
Error=0
因此,在使用 @@ERROR 时,建议在错误发生时立即将错误号捕获到变量中,然后继续使用该变量进行处理。以下示例对此进行了说明。
DECLARE @Value int;
RAISERROR(N'Message', 16, 1);
SET @Value = @@ERROR;
IF @Value <> 0
PRINT 'Error=' + CAST(@Value AS VARCHAR(8));
输出如下所示,其中消息的 ID 已成功捕获到变量@Value中。
Msg 50000, Level 16, State 1, Line 2
Message
Error=50000
T-SQL 中的错误处理
T-SQL Try Catch 用于处理 SQL Server 编程中的错误。SQL Server 中的 TRY-CATCH 的工作方式与 Java 和 C# 等流行编程语言中的异常处理类似。例如,当使用 TRY CATCH 编写 T-SQL 代码并且 TRY 块中的代码失败时,执行流将退出 TRY 块并转到 CATCH 块。
下面是 SQL Server 中错误处理的一个示例:
BEGIN TRY
SELECT 50/0
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS ErrorNumber
,ERROR_STATE() AS ErrorState
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
END CATCH
如果我们仅执行 50/0,则执行将失败,无法处理错误。在上面的示例中,当发生错误时,流程将移至处理错误的 catch 块。例如,在 catch 块中,我们可以将错误记录在日志表中以跟踪错误。
另外,请注意 ERROR_NUMBER()、ERROR_STATE()、ERROR_LINE() 和 ERROR_MESSAGE() 函数的使用,它们在 catch 块中非常有用。
结论
在本指南中,您学习了 T-SQL 中错误处理的基础知识。如果操作正确,错误处理不仅可以让您更好地了解数据库中的错误,还可以在错误发生时记录错误。
要了解有关 T-SQL 的更多信息,您还可以阅读以下指南:
[T-SQL 简介](/content/ps/en/resources/blog/guides/introduction-tsql-querying.html)
祝您编码愉快!
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~