SQL Server 中的异常处理






4.40/5 (16投票s)
如何有效处理 SQL Server 中的错误?
引言
SQL Server 中处理错误变得更加容易,这得益于多种不同的方法。SQL Server 2005 引入了一种新的选项,可以有效地处理错误。有时我们无法捕获最终用户处发生的错误。即使我们想知道最终用户处发生的错误,我们也需要编写代码将其发送给我们。这会给服务器带来额外的开销。
SQL Server 2005 引入了 TRY
...CATCH
语句,这有助于我们在后端有效地处理错误。这种异常处理可以提供有关错误的更多信息。
TRY...CATCH
TRY
...CATCH
语句的工作方式与编程语言中的类似。它首先执行我们在 TRY
块中编写的 SQL 语句,如果发生任何错误,则执行 CATCH
块。
BEGIN TRY
// SQL Statements
END TRY
BEGIN CATCH
//Handle the exception details
END CATCH
有许多错误处理属性语句,如下所示
ERROR_NUMBER()
ERROR_STATE()
ERROR_SEVERITY()
ERROR_LINE()
ERROR_PROCEDURE()
ERROR_MESSAGE()
通常,SQL Server 将执行过程中发生的默认错误消息存储在以下系统表中
select * from sys.messages
但是,我们可以借助这种异常处理创建自己的错误消息详细信息。
使用 TRY...CATCH 处理异常
下面的示例展示了在 Northwind
数据库中 TRY
...CATCH
异常处理技术的实际应用。
USE [NorthWind]
GO
IF OBJECT_ID('dbo.ErrorTracer') IS NOT NULL
BEGIN
DROP TABLE dbo.ErrorTracer
PRINT 'Table dbo.ErrorTracer Dropped'
END
GO
CREATE TABLE ErrorTracer
(
iErrorID INT PRIMARY KEY IDENTITY(1,1),
vErrorNumber INT,
vErrorState INT,
vErrorSeverity INT,
vErrorLine INT,
vErrorProc VARCHAR(MAX),
vErrorMsg VARCHAR(MAX),
vUserName VARCHAR(MAX),
vHostName VARCHAR(MAX),
dErrorDate DATETIME DEFAULT GETDATE()
)
IF OBJECT_ID('dbo.ErrorTracer') IS NOT NULL
BEGIN
PRINT 'Table dbo.ErrorTracer Created'
END
GO
IF OBJECT_ID('Proc_InsertErrorDetails') IS NOT NULL
BEGIN
DROP PROCEDURE [dbo].[Proc_InsertErrorDetails]
PRINT 'Procedure Proc_InsertErrorDetails Dropped'
END
GO
CREATE PROCEDURE Proc_InsertErrorDetails
AS
/*
Purpose : Insert the error details occurred in the SQL query
Input : Insert the details which receives from the TRY...CATCH block
Output : Insert the details of received errors into the ErrorTracer table
Created By : Senthilkumar
Created On : July 17, 2009
*/
BEGIN
SET NOCOUNT ON
SET XACT_ABORT ON
DECLARE @ErrorNumber VARCHAR(MAX)
DECLARE @ErrorState VARCHAR(MAX)
DECLARE @ErrorSeverity VARCHAR(MAX)
DECLARE @ErrorLine VARCHAR(MAX)
DECLARE @ErrorProc VARCHAR(MAX)
DECLARE @ErrorMesg VARCHAR(MAX)
DECLARE @vUserName VARCHAR(MAX)
DECLARE @vHostName VARCHAR(MAX)
SELECT @ErrorNumber = ERROR_NUMBER()
,@ErrorState = ERROR_STATE()
,@ErrorSeverity = ERROR_SEVERITY()
,@ErrorLine = ERROR_LINE()
,@ErrorProc = ERROR_PROCEDURE()
,@ErrorMesg = ERROR_MESSAGE()
,@vUserName = SUSER_SNAME()
,@vHostName = Host_NAME()
INSERT INTO ErrorTracer(vErrorNumber,vErrorState,vErrorSeverity,vErrorLine,_
vErrorProc,vErrorMsg,vUserName,vHostName,dErrorDate)
VALUES(@ErrorNumber,@ErrorState,@ErrorSeverity,@ErrorLine,@ErrorProc,_
@ErrorMesg,@vUserName,@vHostName,GETDATE())
END
IF OBJECT_ID('Proc_InsertErrorDetails') IS NOT NULL
BEGIN
PRINT 'Procedure Proc_InsertErrorDetails Created'
END
GO
IF OBJECT_ID('Proc_ExceptionHandlingExample') IS NOT NULL
BEGIN
DROP PROCEDURE [dbo].[Proc_ExceptionHandlingExample]
PRINT 'Procedure Proc_ExceptionHandlingExample Dropped'
END
GO
CREATE PROCEDURE Proc_ExceptionHandlingExample
AS
BEGIN
/*
Purpose : Sample procedure for check the Try...Catch
Output : It will insert into ErrorTracer table if this
stored procedure throws any error
Created By : Senthilkumar
Created On : July 17, 2009
*/
SET NOCOUNT ON
SET XACT_ABORT ON
BEGIN TRY
SELECT 15/0
END TRY
BEGIN CATCH
EXEC Proc_InsertErrorDetails
END CATCH
END
IF OBJECT_ID('Proc_ExceptionHandlingExample') IS NOT NULL
BEGIN
PRINT 'Procedure Proc_ExceptionHandlingExample Created'
END
GO
EXEC Proc_ExceptionHandlingExample
SELECT * FROM ErrorTracer
步骤
步骤 1:创建名为“ErrorTracer
”的自定义错误表。
步骤 2:编写用于处理当前异常的通用存储过程,名为 Proc_InsertErrorDetails
,它将帮助我们将错误详细信息插入到 步骤 1
中创建的表中。
步骤 3:编写一个示例过程,并使用 TRY
...CATCH
语句执行异常处理。每当发生错误时,它将调用 Proc_InsertErrorDetails
,然后将插入错误详细信息。
步骤 4:现在,检查 ErrorTracer
表,它将列出捕获的错误详细信息。
结论
这种定制的错误处理技术有助于我们有效地改进后端错误详细信息。我们已经在表中提供了日期和用户名详细信息,这将帮助您根据日期和用户名分别查找错误详细信息。
历史
- 2009 年 7 月 17 日:初始发布