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. @AccountNum INT,
  3. @Amount DECIMAL
  4. AS
  5. BEGIN
  6. BEGINTRANSACTION--beginning a transaction..
  7. UPDATE MyChecking SET Amount = Amount - @Amount
  8. WHERE AccountNum = @AccountNum
  9. IF @@ERROR != 0 --check @@ERROR variable after each DML statements..
  10. BEGIN
  11. ROLLBACKTRANSACTION--RollBack Transaction if Error..
  12. RETURN
  13. END
  14. ELSE
  15. BEGIN
  16. UPDATE MySavings SET Amount = Amount + @Amount
  17. WHERE AccountNum = @AccountNum
  18. IF @@ERROR != 0 --check @@ERROR variable after each DML statements..
  19. BEGIN
  20. ROLLBACKTRANSACTION--RollBack Transaction if Error..
  21. RETURN
  22. END
  23. ELSE
  24. BEGIN
  25. COMMITTRANSACTION--finally, Commit the transaction if Success..
  26. RETURN
  27. END
  28. END
  29. END
  30. 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. Try Statement 1
  3. Try Statement 2
  4. ...
  5. Try Statement M
  6. END TRY
  7. BEGIN CATCH
  8. Catch Statement 1
  9. Catch Statement 2
  10. ...
  11. Catch Statement N
  12. END CATCH

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

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

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

简单示例:

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

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

  1. ALTER PROC usp_AccountTransaction
  2. @AccountNum INT,
  3. @Amount DECIMAL
  4. AS
  5. BEGIN
  6. BEGIN TRY --Start the Try Block..
  7. BEGINTRANSACTION-- Start the transaction..
  8. UPDATE MyChecking SET Amount = Amount - @Amount
  9. WHERE AccountNum = @AccountNum
  10. UPDATE MySavings SET Amount = Amount + @Amount
  11. WHERE AccountNum = @AccountNum
  12. COMMIT TRAN -- Transaction Success!
  13. END TRY
  14. BEGIN CATCH
  15. IF @@TRANCOUNT > 0
  16. ROLLBACK TRAN --RollBack in case of Error
  17. -- you can Raise ERROR with RAISEERROR() Statement including the details of the exception
  18. RAISERROR(ERROR_MESSAGE(), ERROR_SEVERITY(), 1)
  19. END CATCH
  20. END
  21. GO

使用TRY CATCH进行SQL Server异常处理的更多相关文章

  1. SQL Server 异常处理机制(Begin try Begin Catch) 摘录

    begin try --SQL end try begin catch --sql (处理出错动作) end catch 我们将可能会出错的sql 写在begin try...end try 之间,若 ...

  2. SQL Server中事务、锁定和阻塞

    事务是什么 在SQL Server中事务是构成一个工作逻辑单元的一系列任务,也就说多个任务放在一起执行,这些任务要么全部执行成功,要么全部执行失败. 通过事务我们可以保证数据的完整性,例如:用户A给用 ...

  3. SQL Server错误严重性级别和异常处理

    关于SQL Server的错误严重性级别的说明,强烈认真看一下下面的两个链接 脱机帮助 ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/sqlerrm9/html/ ...

  4. SQL Server数据库存储过程的异常处理

    SQL Server数据库存储过程的异常处理是非常重要的,明确的异常提示能够帮助我们快速地找到问题的根源,节省很多时间.本文我们就以一个插入数据为例来说明SQL Server中的存储过程怎么捕获异常的 ...

  5. 在 SQL Server 中使用 Try Catch 处理异常

    如何在 SQL Server 中使用 Try Catch 处理错误? 从 SQL Server 2005 开始,我们在TRY 和 CATCH块的帮助下提供了结构错误处理机制.使用TRY-CATCH的语 ...

  6. (转)SQL Server2005 异常处理机制(Begin try Begin Catch)

    begin try --SQL  end trybegin catch --sql (处理出错动作) end catch我们将可能会出错的sql 写在begin try...end try 之间,若出 ...

  7. SQL Server 数据库try catch 存储过程

    SQL Server 在生产环境中这样写存储过程的坑都避免了吗? 原文链接: http://www.cnblogs.com/chenmh/p/7856777.html 概述 最近因为业务的需求写了一段 ...

  8. SQL Server中事务transaction如果没写在try catch中,就算中间语句报错还是会提交

    假如我们数据库中有两张表Person和Book Person表: CREATE TABLE [dbo].[Person]( ,) NOT NULL, ) NULL, ) NULL, [CreateTi ...

  9. sql server 笔记1--case、WAITFOR、TRY CATCH

    一.case 转自:http://blog.csdn.net/add8849/article/details/576424 深入使用:http://blog.csdn.net/akuoma/artic ...

随机推荐

  1. Django用ajax发送post请求时csrf拦截的解决方案

    把下面的代码写在模版文件中就可以了, 注:不是js文件,是模版文件加载的执行的,所有写js里没效果 $.ajaxSetup({ data: {csrfmiddlewaretoken: '{{ csrf ...

  2. valuestack,stackContext,ActionContext.之间的关系以及action的数据在页面中取得的方法

     转自:http://blog.csdn.net/quechao123/article/details/4406148 1.三者之间的关系如下图所示: 2.action的数据在页面中取得的方法 在st ...

  3. memset和memcopy用法

    void *memset(void *s, int ch, size_t n); 函数解释:将s中前n个字节 (typedef unsigned int size_t)用 ch 替换并返回 s . m ...

  4. js 处理移动端触摸事件

    在处理移动端的touch事件时,我们可以选择一些插件来处理,比如jquery ui touch punch.js 提供丰富的触摸效果,可以满足移动端的开发, 但是,有些移动端开发中,并不需要如此复杂的 ...

  5. unity的一些重要技巧(转)【整理他人的东西】

    刚开始学习Unity3D时间不长,在看各种资料.除了官方的手册以外,其他人的经验也是非常有益的.偶尔看到老外这篇文章,觉得还不错,于是翻译过来和大家共享.原文地址: http://devmag.org ...

  6. http接口测试框架-构想图

    写这篇,是当初如何学习,如何写,如何实现,总体的流程

  7. ONVIF Device Manager v2.2.146

    对接ONVIF使用软件,用于对接支持onvif协议的IPC厂家设置 http://download.csdn.net/detail/li_dabo/9761415

  8. C++ STL, sort用法。

    在algorithm头文件中的sort可以给任意对象排序,包括内置类型和自定义类型,前提是定义了“<“运算符. sort(begin,end),表示一个范围,例如: #include" ...

  9. ACM学习历程—SGU 275 To xor or not to xor(xor高斯消元)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=275 这是一道xor高斯消元. 题目大意是给了n个数,然后任取几个数,让他们xor和 ...

  10. 让Django支持数据库长连接(可以提高不少性能哦)

    书接上回 上回我们说到:<在生产系统使用Tornado WebServer来代替FastCGI加速你的Django应用> 那么现在很流行用一些高性能的nonblock的app server ...