使用TRY CATCH进行SQL Server异常处理

SQL SERVER 2000中异常处理: 

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会被下一个数据库操作所覆盖. 所以在每次操作完后必须立即监测.

SQL SERVER 2005中异常处理:

TRY...CATCH是SQL Server 2005提供的更具有可读性的语法.每个开发人员都熟悉这种写法.SQL Server 2005仍然支持@@ERROR这种用法.

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

2.获得错误信息的函数表: 

下面系统函数在CATCH块有效.可以用来得到更多的错误信息:

函数描述
ERROR_NUMBER()返回导致运行 CATCH 块的错误消息的错误号。
ERROR_SEVERITY()返回导致 CATCH 块运行的错误消息的严重级别
ERROR_STATE()返回导致 CATCH 块运行的错误消息的状态号
ERROR_PROCEDURE()返回出现错误的存储过程名称
ERROR_LINE()返回发生错误的行号
ERROR_MESSAGE()返回导致 CATCH 块运行的错误消息的完整文本


简单示例:

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回滚/提交事务的示例

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






转载于:https://my.oschina.net/u/1426828/blog/608202

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值