使用Try / Catch来处理SQL Server错误的逐步指南

在不中断执行的情况下识别错误

一个玩具危险标志,周围是其他各种各样的道路警告标志

Larry Washburn / Getty Images

交易中的尝试/捕获声明 -SQL检测和处理数据库应用程序中的错误条件。这句话是SQL Server错误处理的基础,也是开发健壮的数据库应用程序的重要组成部分。

尝试/ Catch适用于以2008,Azure SQL数据库,Azure SQL数据仓库和并行数据仓库开始的SQL Server。

引入TRY / CATCH

尝试通过指定两个Transact-SQL语句:您要“尝试”和另一个用于“catch”可能出现的错误的原作。当SQL Server遇到Try / Catch语句时,它会立即执行Try子句中包含的语句。如果尝试语句成功执行,则SQL Server会继续。但是,如果TRY语句生成错误,则SQL Server执行CART语句以优雅地处理错误。

基本语法采用以下形式:

开始尝试
{sql_statement |声明块}
结束尝试
开始抓
[sql_statement | statement_block}]
结束捕获
[;]

尝试/抓住示例

考虑一个包含名为的表的人力资源数据库雇员,其中包含公司中每个员工的信息。该表使用一个整数员工ID号作为首要的关键

您可能会尝试使用下面的声明将新员工插入数据库:

插入员工(id,first_name,last_name,扩展名)
价值观(12497,'Mike','Chapple',4201)

在正常情况下,该语句将向Employees表添加一行。但是,如果一个ID为12497的员工已经存在于数据库中,插入该行将违反主键约束,并导致以下错误:

MSG 2627,14级,状态1,第1行
违反主键约束'pk_employee_id'。无法在对象'dbo.employeea'中插入重复密钥。
该语句已终止。

虽然此错误为您提供对问题进行故障排除的信息,但它有两个问题。首先,该消息是密切的。它包括普通用户难以理解的错误代码,行号和其他信息。第二,更重要的是,它导致声明中止并可能导致申请崩溃。

替代方案是在尝试中包装语句... Catch语句,如下所示:

开始尝试
插入员工(id,first_name,last_name,扩展名)
价值观(12497,'Mike','Chapple',4201)
结束尝试
开始抓
Print ' error: ' + error_message ();
exec msdb.dbo.sp_send_dbmail.
@profile_name = 'Employee Mail',
@recipients =“hr@foo.com”,
@body ='发生错误创建新的员工记录。',
@subject ='employee数据库错误';
结束捕获

在本例中,发生的任何错误都会报告给执行该命令的用户和hr@foo.com电子邮件地址。向用户显示的错误是:

错误:违反主键约束'pk_employee_id'。
无法在对象'dbo.employeea'中插入重复密钥。
邮件排队。

应用程序执行正常,允许程序员处理错误。尝试/ catch语句的使用是一种优雅的方式来主动检测和处理SQL Server数据库应用程序中发生的错误。

学习更多

要了解有关结构化查询语言的更多信息,请查看我们的文章SQL简介

这个页面有用吗?