zoukankan      html  css  js  c++  java
  • 使用TRY CATCH进行SQL Server异常处理

    TRY...CATCH是Sql Server 2005/2008令人印象深刻的新特性.提高了开发人员异常处理能力.没有理由不尝试一下Try.. Catch功能.

        *      TRY 块 - 包含可能产生异常的代码或脚本
        *      CATCH 块 - 如果TRY块出现异常,代码处理流将被路由到CATCH块.在这里你可以处理异常,记录日志等.
    Sql Server中的Try Catch和C#,JAVA等语言的处理方式一脉相承.这种一致性才是最大的创新之处.

    SQL SERVER 2000中异常处理:

    1. CREATE PROC usp_AccountTransaction 
    2.  
    3.     @AccountNum INT
    4.  
    5.     @Amount DECIMAL 
    6.  
    7. AS 
    8.  
    9. BEGIN 
    10.  
    11.     BEGINTRANSACTION--beginning a transaction.. 
    12.  
    13.         UPDATE MyChecking SET Amount = Amount - @Amount 
    14.  
    15.             WHERE AccountNum = @AccountNum 
    16.  
    17.         IF @@ERROR != 0 --check @@ERROR variable after each DML statements.. 
    18.  
    19.         BEGIN 
    20.  
    21.             ROLLBACKTRANSACTION--RollBack Transaction if Error.. 
    22.  
    23.             RETURN 
    24.  
    25.         END 
    26.  
    27.         ELSE 
    28.  
    29.         BEGIN 
    30.  
    31.             UPDATE MySavings SET Amount = Amount + @Amount 
    32.  
    33.                 WHERE AccountNum = @AccountNum 
    34.  
    35.             IF @@ERROR != 0 --check @@ERROR variable after each DML statements.. 
    36.  
    37.             BEGIN 
    38.  
    39.                 ROLLBACKTRANSACTION--RollBack Transaction if Error.. 
    40.  
    41.                 RETURN 
    42.  
    43.             END 
    44.  
    45.             ELSE 
    46.  
    47.             BEGIN 
    48.  
    49.                 COMMITTRANSACTION--finally, Commit the transaction if Success.. 
    50.  
    51.                 RETURN 
    52.  
    53.             END 
    54.  
    55.         END 
    56.  
    57. END 
    58.  
    59. GO 

    上面是Sql server 2000的一个存储过程,在每个数据库操作之后立即必须检查@@ERROR,进行Commit / RollBack该事务.
    Sql server 2000中监测错误,只能通过监测全局遍历 @@ERROR.由于@@ERROR会被下一个数据库操作所覆盖. 所以在每次操作完后必须立即监测.

    SQL SERVER 2005中异常处理:

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

    1.try catch语法:

    1.   BEGIN TRY 
    2.  
    3.     Try Statement 1 
    4.  
    5.     Try Statement 2 
    6.  
    7.     ... 
    8.  
    9.     Try Statement M 
    10.  
    11. END TRY 
    12.  
    13. BEGIN CATCH 
    14.  
    15.     Catch Statement 1 
    16.  
    17.     Catch Statement 2 
    18.  
    19.     ... 
    20.  
    21.     Catch Statement N 
    22.  
    23. END CATCH 

     

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

     

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

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


    简单示例:

    1. BEGIN TRY 
    2.  
    3.     SELECT GETDATE() 
    4.  
    5.     SELECT 1/0--Evergreen divide by zero example! 
    6.  
    7. END TRY 
    8.  
    9. BEGIN CATCH 
    10.  
    11.     SELECT'There was an error! ' + ERROR_MESSAGE() 
    12.  
    13.     RETURN 
    14.  
    15. END CATCH; 

    3.try catch回滚/提交事务的示例

    1. ALTER PROC usp_AccountTransaction 
    2.  
    3.     @AccountNum INT
    4.  
    5.     @Amount DECIMAL 
    6.  
    7. AS 
    8.  
    9. BEGIN 
    10.  
    11.     BEGIN TRY --Start the Try Block.. 
    12.  
    13.         BEGINTRANSACTION-- Start the transaction.. 
    14.  
    15.             UPDATE MyChecking SET Amount = Amount - @Amount 
    16.  
    17.                 WHERE AccountNum = @AccountNum 
    18.  
    19.             UPDATE MySavings SET Amount = Amount + @Amount 
    20.  
    21.                 WHERE AccountNum = @AccountNum 
    22.  
    23.         COMMIT TRAN -- Transaction Success! 
    24.  
    25.     END TRY 
    26.  
    27.     BEGIN CATCH 
    28.  
    29.         IF @@TRANCOUNT > 0 
    30.  
    31.             ROLLBACK TRAN --RollBack in case of Error 
    32.  
    33.         -- you can Raise ERROR with RAISEERROR() Statement including the details of the exception 
    34.  
    35.         RAISERROR(ERROR_MESSAGE(), ERROR_SEVERITY(), 1) 
    36.  
    37.     END CATCH 
    38.  
    39. END 
    40.  
    41. GO 
  • 相关阅读:
    WP8.1通过StreamSocket连接C++服务器
    WP10通过StreamSocket连接C++服务器
    二维背包(两个限制条件)
    dp(多重背包)
    dp(完全背包)
    dfs(迷宫)
    bfs迷宫
    蚁人cp数
    二分(老死不相往来)
    前缀和(狼和野牛)
  • 原文地址:https://www.cnblogs.com/Veky/p/3256098.html
Copyright © 2011-2022 走看看