逐步指南使用TRY ... CATCH处理SQL Server错误

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

Transact- SQL中的TRY ... CATCH语句检测并处理数据库应用程序中的错误条件。 此声明是SQL Server错误处理的基石,是开发健壮数据库应用程序的重要组成部分。 TRY ... CATCH适用于从2008开始的SQL Server,Azure SQL数据库,Azure SQL数据仓库和并行数据仓库。

介绍TRY..CATCH

TRY ... CATCH的工作原理是允许您指定两个Transact-SQL语句:一个您想要“尝试”,另一个用于“捕捉”可能出现的任何错误。 当SQL Server遇到TRY ... CATCH语句时,它立即执行包含在TRY子句中的语句。 如果TRY语句成功执行,则SQL Server将继续前进。 但是,如果TRY语句生成错误,SQL Server将执行CATCH语句以正常处理错误。

基本语法采用这种形式:

BEGIN TRY {sql_statement | statement_block} END TRY BEGIN CATCH [{sql_statement | statement_block}] END CATCH [; ]

TRY ... CATCH示例

通过使用示例来理解这个语句的使用是最容易的。 假设您是包含名为“Employees”的表的人力资源数据库的管理员,该表包含有关组织中每个员工的信息。 该表使用整数员工ID号作为主键 。 您可能会尝试使用以下语句将新员工插入数据库中:

INSERT INTO employees(id,first_name,last_name,extension)VALUES(12497,'Mike','Chapple',4201)

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

Msg 2627,Level 14,State 1,Line 1违反PRIMARY KEY约束'PK_employee_id'。 不能在对象'dbo.employees'中插入重复键。 该语句已终止。

尽管此错误为您提供了解决问题所需的信息,但存在两个问题。 首先,信息是神秘的。 它包括错误代码,行号和其他普通用户无法理解的信息。 其次,更重要的是,它会导致语句中止并可能导致应用程序崩溃。

另一种方法是将该语句包装在TRY ... CATCH语句中,如下所示:

BEGIN TRY INSERT INTO employees(id,first_name,last_name,extension)VALUES(12497,'Mike','Chapple',4201)END TRY BEGIN CATCH PRINT'Error:'+ ERROR_MESSAGE(); EXEC msdb.dbo.sp_send_dbmail @profile_name ='Employee Mail',@recipients ='hr@foo.com',@body ='创建新员工记录时发生错误。',@subject ='员工ID重复错误'; END CATCH

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

错误:违反PRIMARY KEY约束'PK_employee_id'。 不能在对象'dbo.employees'中插入重复键。 邮件排队。

最重要的是,应用程序执行正常继续,允许程序员正常处理错误。 TRY ... CATCH语句的使用是主动检测和处理SQL Server数据库应用程序中发生的错误的一种很好的方法。

学习更多

如果您想了解更多关于结构化查询语言的内容,请阅读SQL简介