逐步指南使用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簡介