最近需要在 DB Procedure中使用事务(Transaction)。顺便做个记录和例子。
要兼容 SQL 2K 与 SQL 2005,所以不能使用 Try ... Catch ..(Only For SQL2005)
没有办法,只能用 IF @@ERROR <> 0 捕捉错误了。
简单说下 SQL错误 和 @@ERROR:
通过执行Transact-SQL而产生的错误可分为两种:致命错误(fatal error)和非致命错误(non-fatal error)。在Transact-SQL中只可以捕捉非致命错误(如键值冲突),而无法捕捉致命错误(如语法错误)。
在Transact-SQL中可以通过系统变量@@ERROR判断最近执行的一条语句是否成功执行。如果发生了错误,@@Error的值大于0,否则值为0。
举例如下:
- CREATE PROCEDURE Tran_Procedure
- AS
- Begin
- BEGIN TRANSACTION
- --语句1
- UPDATE C SET detail ='step10' WHERE c.id <= 3
- IF @@ERROR <> 0
- BEGIN
- ROLLBACK TRANSACTION
- PRINT '语句1 发生错误'
- PRINT '回滚且立即退出Procedure '
- RETURN
- END
- --语句2
- SELECT * INTO #tempB FROM dbo.B
- IF @@ERROR <> 0
- BEGIN
- ROLLBACK TRANSACTION
- PRINT '语句2 发生错误'
- PRINT '回滚且立即退出Procedure '
- RETURN
- END
- --语句3
- DROP TABLE #tempC
- IF @@ERROR <> 0
- BEGIN
- ROLLBACK TRANSACTION
- PRINT '语句3 发生错误'
- PRINT '回滚且立即退出Procedure '
- RETURN
- END
- --语句4
- UPDATE C SET detail ='step2' WHERE c.id >1000
- IF @@ERROR <> 0
- BEGIN
- ROLLBACK TRANSACTION
- PRINT '语句4 发生错误'
- PRINT '回滚且立即退出Procedure '
- RETURN
- END
- --语句5
- SELECT * FROM dbo.B
- PRINT '语句5执行了'
- --提交事务
- COMMIT TRANSACTION
- PRINT '事务已经提交'
- PRINT 'Procedure 执行完成'
- END