WEB开发网
开发学院数据库MSSQL Server 深入理解SQL Server 中的错误处理 阅读

深入理解SQL Server 中的错误处理

 2007-05-19 09:44:32 来源:WEB开发网   
核心提示: CREATE PROCEDURE usp_TestTransaction(@ParamValue CHAR(1),@ThrowError BIT = 0)ASBEGINDECLARE @ErrorCode INTBEGIN TRANSACTIONINSERT INTO Transactio
CREATE PROCEDURE usp_TestTransaction
(
@ParamValue CHAR(1),
@ThrowError BIT = 0
)
AS
BEGIN
DECLARE @ErrorCode INT
BEGIN TRANSACTION
INSERT INTO Transactions (ParamValue, ThrowError)
VALUES(@ParamValue, @ThrowError)
IF @ThrowError = 1
RAISERROR ('A custom error has been thrown.', 16, 1)
SET @ErrorCode = @@ERROR
IF @ErrorCode <> 0
GOTO ErrorHandler
ELSE
BEGIN
COMMIT TRAN
RETURN(0)
END
ErrorHandler:
BEGIN
ROLLBACK TRANSACTION
RETURN(1)
END
END
GO

列表A

这个简单的存储过程展示了有效的错误处理必须具备的特征。首先,要明确定义一个事务。然后当一条记录插入事务表格之后,我们再检查参数@ThrowError的值。该参数显示是否有错误发生,再用函数RAISERROR来指出自定义的错误。当函数RAISERROR被调用时,变量@@ERROR的值显示的就是我们所提供错误的号码。

如果在存储过程中有错误发生,我们将重新运行所执行的事务。重新运行事务就意味着我们尝试插入事务表格的记录将会被移除,就像从来没有发生过一样。数据库的状态将与事务开始之前完全保持一致。

在这个例子中,你同样会注意到GOTO语句和ErrorHandler标签的使用。通常,使用GOTO语句在迭代编程语言中被认为是一种不好的编程习惯,但是在SQL Server 2000错误处理时,它们就非常有用了。不要害怕用GOTO语句来处理错误。

下面这个程序调用将出现错误,记录将不会被插入事务表格中:

DECLARE @ReturnCode INT
EXECUTE @ReturnCode = usp_TestTransaction @ParamValue = 'E', @ThrowError = 1
PRINT @ReturnCode

下面这个程序调用将不会出现错误,插入的记录将被提交到事务表格:

DECLARE @ReturnCode INT
EXECUTE @ReturnCode = usp_TestTransaction @ParamValue = 'S', @ThrowError = 0
PRINT @ReturnCode

这些程序调用利用了参数Return,它能够显示出一个存储过程的成功与否。在你的代码中明确设置参数Return,来显示程序运行是否成功是一个很好的编程习惯。这样,当存储过程失败的时候,你可以得知,并采取必要的措施来处理。例如,你可以嵌套程序调用和事务。你的应用可以潜在地定义一个事务,调用一个存储过程和提交或回滚外部事务(取决于存储过程的成败)。

放眼未来

SQL Server 2000中有效的错误处理的关键在于细致的事务设计和始终对变量@@ERROR 的值的检查。在日后的文章中,我将向你说明如何在SQL Server 2005中利用TRYCATCH语句的错误处理新能力。

上一页  1 2 3 

Tags:深入 理解 SQL

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接