| CREATE TABLE Transactions
(
TranID SMALLINT IDENTITY(1,1) PRIMARY KEY,
EntryDate SMALLDATETIME DEFAULT(GETDATE()),
ParamValue CHAR(1),
ThrowError BIT
) |
脚本中的两个字段值是ParamValue和ThrowError。这些字段将与我们要创建的程序中的输入参数相对应,并且我们将在提交事务的逻辑中用到它们。 一旦用来记录事务的表格预备就绪之后,我们就要开始创建程序了。这个程序中将有一个用来简单记录字符值和参量的参数,它将使我们能够指出程序中的错误。运行列表A中的语句可以创建这个程序。 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 |
下面这个程序调用将不会出现错误,插入的记录将被提交到事务表格: |