SQL SERVER 2000中异常处理: sql
CREATE PROC usp_AccountTransaction @AccountNum INT, @Amount DECIMAL AS BEGIN BEGIN TRANSACTION --beginning a transaction.. UPDATE MyChecking SET Amount = Amount - @Amount WHERE AccountNum = @AccountNum IF @@ERROR != 0 --check @@ERROR variable after each DML statements.. BEGIN ROLLBACK TRANSACTION --RollBack Transaction if Error.. RETURN END ELSE BEGIN UPDATE MySavings SET Amount = Amount + @Amount WHERE AccountNum = @AccountNum IF @@ERROR != 0 --check @@ERROR variable after each DML statements.. BEGIN ROLLBACK TRANSACTION --RollBack Transaction if Error.. RETURN END ELSE BEGIN COMMIT TRANSACTION --finally, Commit the transaction if Success.. RETURN END END END GO
上面是Sql server 2000的一个存储过程,在每一个数据库操做以后当即必须检查@@ERROR ,进行Commit / RollBack该事务.
Sql server 2000中监测错误,只能经过监测全局遍历 @@ERROR.因为@@ERROR会被下一个数据库操做所覆盖. 因此在每次操做完后必须当即监测.数据库
TRY...CATCH是SQL Server 2005提供的更具备可读性的语法.每一个开发人员都熟悉这种写法.SQL Server 2005仍然支持@@ERROR这种用法.ide
BEGIN TRY Try Statement 1 Try Statement 2 ... Try Statement M END TRY BEGIN CATCH Catch Statement 1 Catch Statement 2 ... Catch Statement N END CATCH
下面系统函数在CATCH块有效.能够用来获得更多的错误信息:函数
函数 | 描述 |
---|---|
ERROR_NUMBER() | 返回致使运行 CATCH 块的错误消息的错误号。 |
ERROR_SEVERITY() | 返回致使 CATCH 块运行的错误消息的严重级别 |
ERROR_STATE() | 返回致使 CATCH 块运行的错误消息的状态号 |
ERROR_PROCEDURE() | 返回出现错误的存储过程名称 |
ERROR_LINE() | 返回发生错误的行号 |
ERROR_MESSAGE() | 返回致使 CATCH 块运行的错误消息的完整文本 |
简单示例:spa
BEGIN TRY SELECT GETDATE() SELECT 1/0--Evergreen divide by zero example! END TRY BEGIN CATCH SELECT 'There was an error! ' + ERROR_MESSAGE() RETURN END CATCH;
3.try catch回滚/提交事务的示例.net
ALTER PROC usp_AccountTransaction @AccountNum INT, @Amount DECIMAL AS BEGIN BEGIN TRY --Start the Try Block.. BEGIN TRANSACTION -- Start the transaction.. UPDATE MyChecking SET Amount = Amount - @Amount WHERE AccountNum = @AccountNum UPDATE MySavings SET Amount = Amount + @Amount WHERE AccountNum = @AccountNum COMMIT TRAN -- Transaction Success! END TRY BEGIN CATCH IF @@TRANCOUNT > 0 ROLLBACK TRAN --RollBack in case of Error -- you can Raise ERROR with RAISEERROR() Statement including the details of the exception RAISERROR(ERROR_MESSAGE(), ERROR_SEVERITY(), 1) END CATCH END GO