1. 测试注意 :①假如系统能捕获异常 ,并且我们自己开启了事务。系统会自动 回滚事务的,但是 我们还是要在catch里面加上 rollback tran的习惯,
    这样也不会提示重复rollback的错误,这样是不会报错的。。没手动开启事务,系统将正常执行的会保存。
  2.  
  3. begin try 语句1,语句2 end try ,假如语句1被捕获到异常,语句2不会执行了。直接跳到 catch执行了。
    ③太严重的错误是直接pass了捕获,不会捕捉异常了。有事务的 还需要我们去手工执行 commit,或rollback tran
    ④太严重错误,借助 exec可以捕获。
  4. IF (OBJECT_ID('AA','U') IS NOT NULL)
  5. DROP TABLE AA
  6. CREATE TABLE AA(ID INT)
  7.  
  8. SELECT * FROM AA
  9.  
  10. --注:数据库当前只存在表AA,无表#BB和表BB
  11.  
  12. -----------------------------------------------------
  13. -----------------------------------------------------
  14.  
  15. -- 【案例1
  16. BEGIN TRAN
  17. BEGIN TRY
  18. INSERT INTO AA SELECT 1 --A
  19. INSERT INTO #BB SELECT 1 --B处
  20. COMMIT TRAN;
  21. END TRY
  22. BEGIN CATCH
  23. SELECT ERROR_MESSAGE() AS ErrorMessage
  24. ,ERROR_SEVERITY() AS ErrorSeverity
  25. ,ERROR_STATE() AS ErrorState
  26. ROLLBACK TRAN;
  27. END CATCH
  28.  
  29. /*运行结果:
  30.  
  31. (1 行受影响)
  32. 消息 208,级别 16,状态 0,第 4 行
  33. 对象名 '#BB' 无效。
  34.  
  35. 说明:A处已经执行;B处中断操作,下面语句未执行
  36. 查询表AA已经有数据,此时可手动继续操作提交或回滚
  37. */
  38.  
  39. -----------------------------------------------------
  40. -----------------------------------------------------
  41. -- 【案例2
  42. BEGIN TRAN
  43. BEGIN TRY
  44. INSERT INTO AA SELECT 1 --A
  45. INSERT INTO BB SELECT 1 --B
  46. COMMIT TRAN;
  47. END TRY
  48. BEGIN CATCH
  49. SELECT ERROR_MESSAGE() AS ErrorMessage
  50. ,ERROR_SEVERITY() AS ErrorSeverity
  51. ,ERROR_STATE() AS ErrorState
  52. ROLLBACK TRAN;
  53. END CATCH
  54.  
  55. /*运行结果:
  56. 注意:【案例1】使用临时表#BB,【案例2】使用表BB
  57.  
  58. 选中代码执行两次,结果不一样!
  59.  
  60. 第一次执行结果(不捕获异常),同【案例1】:
  61.  
  62. (1 行受影响)
  63. 消息 208,级别 16,状态 0,第 4 行
  64. 对象名 '#BB' 无效。
  65.  
  66. 第二次执行结果(捕获异常):
  67. ErrorMessage ErrorSeverity ErrorState
  68. 对象名 'BB' 无效。 16 1
  69.  
  70. */
  71. -----------------------------------------------------
  72. -----------------------------------------------------
  73.  
  74. -- 【案例3
  75. BEGIN TRAN
  76. BEGIN TRY
  77. INSERT INTO AA SELECT 1 --A
  78. INSERT INTO AA SELECT 'kk' --B
  79. COMMIT TRAN;
  80. END TRY
  81. BEGIN CATCH
  82. SELECT ERROR_MESSAGE() AS ErrorMessage
  83. ,ERROR_SEVERITY() AS ErrorSeverity
  84. ,ERROR_STATE() AS ErrorState
  85. ROLLBACK TRAN;
  86. END CATCH
  87.  
  88. /*运行结果(正常捕获异常):
  89.  
  90. ErrorMessage ErrorSeverity ErrorState
  91. 在将 varchar 值 'kk' 转换成数据类型 int 时失败。 16 1
  92. */
  93.  
  94. -----------------------------------------------------
  95. -----------------------------------------------------
  96.  
  97. -- 【案例4:解决方案】
  98.  
  99. BEGIN TRAN
  100. BEGIN TRY
  101. INSERT INTO AA SELECT 1 --A
  102. EXEC('INSERT INTO #BB SELECT 1')--B
  103. COMMIT TRAN;
  104. END TRY
  105. BEGIN CATCH
  106. SELECT ERROR_MESSAGE() AS ErrorMessage
  107. ,ERROR_SEVERITY() AS ErrorSeverity
  108. ,ERROR_STATE() AS ErrorState
  109. ROLLBACK TRAN;
  110. END CATCH
  111.  
  112. /*正常捕获异常!
  113.  
  114. 不报之前错误:对象名 '#BB' 无效。
  115.  
  116. 但要求格式为:EXEC(@sql)
  117. */
  118.  
  119. -----------------------------------------------------
  120. -----------------------------------------------------
  121.  
  122. -- 【案例5:解决方案】
  123. SET XACT_ABORT ON
  124. BEGIN TRAN
  125. BEGIN TRY
  126. INSERT INTO AA SELECT 1 --A
  127. INSERT INTO #BB SELECT 1 --B处
  128. COMMIT TRAN;
  129. END TRY
  130. BEGIN CATCH
  131. SELECT ERROR_MESSAGE() AS ErrorMessage
  132. ,ERROR_SEVERITY() AS ErrorSeverity
  133. ,ERROR_STATE() AS ErrorState
  134. ROLLBACK TRAN;
  135. END CATCH
  136. SET XACT_ABORT OFF
  137.  
  138. /*运行结果:
  139.  
  140. (1 行受影响)
  141. 消息 208,级别 16,状态 0,第 5 行
  142. 对象名 '#BB' 无效。
  143.  
  144. 报错,但是事务会自动回滚.
  145. 系统默认: SET XACT_ABORT OFF
  146. 当 SET XACT_ABORT 为 ON 时,如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚。
  147. */
  148.  
  149. --查看 XACT_ABORT 是否打开
  150. SELECT (CASE WHEN (16384 & @@OPTIONS) = 16384 THEN 'ON' ELSE 'OFF' END) AS XACT_ABORT;
  151.  
  152. /*
  153.  
  154. 1. 轻微错误(严重性级别为0-10):默认情况下不会给客户程序发送错误消息,继续工作。也就是说它无法被CATCH到
  155.  
  156. 2. 中等错误(严重性级别为11-19):能够被CATCH到(不管是在T-SQL里面还是在客户程序里面)
  157.  
  158. 3. 严重错误(严重性级别为20-25):SQL Server将强制把连接关掉。很显然这也不可能被CATCH到
  159.  
  160. 【重点提示!!】
  161.  
  162. 由于业务的复杂或者系统性能问题,致使数据库sql语句执行较久。
  163.  
  164. 导致客户端网页已经连接超时(如设置为30秒)
  165.  
  166. 此时数据库批处理语句未执行完成,客户session断开,相当于中断操作,类似【案例1】的中断。
  167.  
  168. 事务是没有提交或回滚的,资源仍在占用,导致发生堵塞或死锁!~
  169.  
  170. 【解决方法】:
  171.  
  172. 在批处理语句前加上 SET XACT_ABORT ON
  173. 当客户端中断的时候,未执行完成则回滚操作,及时释放资源。
  174.  
  175.   
  176.  
  177. 测试注意 :①假如系统能捕获异常 ,并且我们自己开启了事务。系统会自动 回滚事务的,但是 我们还是要在catch里面加上
  178. rollback tran的习惯,这样也不会提示重复rollback的错误,这样是不会报错的。。没手动开启事务,系统将正常执行的会保存。
  179. ②begin try 语句块1,语句2 end try ,假如语句1被捕获到异常,语句2不会执行了。直接跳到 catch执行了。
  180.  
  181. IF (OBJECT_ID('AA','U') IS NOT NULL)
  182. DROP TABLE AA
  183. CREATE TABLE AA(ID INT)
  184.  
  185. SELECT * FROM AA
  186.  
  187. --注:数据库当前只存在表AA,无表#BB和表BB
  188.  
  189. -----------------------------------------------------
  190. -----------------------------------------------------
  191.  
  192. -- 【案例1】
  193. BEGIN TRAN
  194. BEGIN TRY
  195. INSERT INTO AA SELECT 1 --A处
  196. INSERT INTO #BB SELECT 1 --B处
  197. COMMIT TRAN;
  198. END TRY
  199. BEGIN CATCH
  200. SELECT ERROR_MESSAGE() AS ErrorMessage
  201. ,ERROR_SEVERITY() AS ErrorSeverity
  202. ,ERROR_STATE() AS ErrorState
  203. ROLLBACK TRAN;
  204. END CATCH
  205.  
  206. /*运行结果:
  207.  
  208. (1 行受影响)
  209. 消息 208,级别 16,状态 0,第 4 行
  210. 对象名 '#BB' 无效。
  211.  
  212. 说明:A处已经执行;B处中断操作,下面语句未执行
  213. 查询表AA已经有数据,此时可手动继续操作提交或回滚
  214. */
  215.  
  216. -----------------------------------------------------
  217. -----------------------------------------------------
  218. -- 【案例2
  219. BEGIN TRAN
  220. BEGIN TRY
  221. INSERT INTO AA SELECT 1 --A
  222. INSERT INTO BB SELECT 1 --B
  223. COMMIT TRAN;
  224. END TRY
  225. BEGIN CATCH
  226. SELECT ERROR_MESSAGE() AS ErrorMessage
  227. ,ERROR_SEVERITY() AS ErrorSeverity
  228. ,ERROR_STATE() AS ErrorState
  229. ROLLBACK TRAN;
  230. END CATCH
  231.  
  232. /*运行结果:
  233. 注意:【案例1】使用临时表#BB,【案例2】使用表BB
  234.  
  235. 选中代码执行两次,结果不一样!
  236.  
  237. 第一次执行结果(不捕获异常),同【案例1】:
  238.  
  239. (1 行受影响)
  240. 消息 208,级别 16,状态 0,第 4 行
  241. 对象名 '#BB' 无效。
  242.  
  243. 第二次执行结果(捕获异常):
  244. ErrorMessage ErrorSeverity ErrorState
  245. 对象名 'BB' 无效。 16 1
  246.  
  247. */
  248. -----------------------------------------------------
  249. -----------------------------------------------------
  250.  
  251. -- 【案例3
  252. BEGIN TRAN
  253. BEGIN TRY
  254. INSERT INTO AA SELECT 1 --A
  255. INSERT INTO AA SELECT 'kk' --B
  256. COMMIT TRAN;
  257. END TRY
  258. BEGIN CATCH
  259. SELECT ERROR_MESSAGE() AS ErrorMessage
  260. ,ERROR_SEVERITY() AS ErrorSeverity
  261. ,ERROR_STATE() AS ErrorState
  262. ROLLBACK TRAN;
  263. END CATCH
  264.  
  265. /*运行结果(正常捕获异常):
  266.  
  267. ErrorMessage ErrorSeverity ErrorState
  268. 在将 varchar 值 'kk' 转换成数据类型 int 时失败。 16 1
  269. */
  270.  
  271. -----------------------------------------------------
  272. -----------------------------------------------------
  273.  
  274. -- 【案例4:解决方案】
  275.  
  276. BEGIN TRAN
  277. BEGIN TRY
  278. INSERT INTO AA SELECT 1 --A
  279. EXEC('INSERT INTO #BB SELECT 1')--B
  280. COMMIT TRAN;
  281. END TRY
  282. BEGIN CATCH
  283. SELECT ERROR_MESSAGE() AS ErrorMessage
  284. ,ERROR_SEVERITY() AS ErrorSeverity
  285. ,ERROR_STATE() AS ErrorState
  286. ROLLBACK TRAN;
  287. END CATCH
  288.  
  289. /*正常捕获异常!
  290.  
  291. 不报之前错误:对象名 '#BB' 无效。
  292.  
  293. 但要求格式为:EXEC(@sql)
  294. */
  295.  
  296. -----------------------------------------------------
  297. -----------------------------------------------------
  298.  
  299. -- 【案例5:解决方案】
  300. SET XACT_ABORT ON
  301. BEGIN TRAN
  302. BEGIN TRY
  303. INSERT INTO AA SELECT 1 --A
  304. INSERT INTO #BB SELECT 1 --B处
  305. COMMIT TRAN;
  306. END TRY
  307. BEGIN CATCH
  308. SELECT ERROR_MESSAGE() AS ErrorMessage
  309. ,ERROR_SEVERITY() AS ErrorSeverity
  310. ,ERROR_STATE() AS ErrorState
  311. ROLLBACK TRAN;
  312. END CATCH
  313. SET XACT_ABORT OFF
  314.  
  315. /*运行结果:
  316.  
  317. (1 行受影响)
  318. 消息 208,级别 16,状态 0,第 5 行
  319. 对象名 '#BB' 无效。
  320.  
  321. 报错,但是事务会自动回滚.
  322. 系统默认: SET XACT_ABORT OFF
  323. 当 SET XACT_ABORT 为 ON 时,如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚。
  324. */
  325.  
  326. --查看 XACT_ABORT 是否打开
  327. SELECT (CASE WHEN (16384 & @@OPTIONS) = 16384 THEN 'ON' ELSE 'OFF' END) AS XACT_ABORT;
  328.  
  329. /*
  330.  
  331. 1. 轻微错误(严重性级别为0-10):默认情况下不会给客户程序发送错误消息,继续工作。也就是说它无法被CATCH到
  332.  
  333. 2. 中等错误(严重性级别为11-19):能够被CATCH到(不管是在T-SQL里面还是在客户程序里面)
  334.  
  335. 3. 严重错误(严重性级别为20-25):SQL Server将强制把连接关掉。很显然这也不可能被CATCH到
  336.  
  337. 【重点提示!!】
  338.  
  339. 由于业务的复杂或者系统性能问题,致使数据库sql语句执行较久。
  340.  
  341. 导致客户端网页已经连接超时(如设置为30秒)
  342.  
  343. 此时数据库批处理语句未执行完成,客户session断开,相当于中断操作,类似【案例1】的中断。
  344.  
  345. 事务是没有提交或回滚的,资源仍在占用,导致发生堵塞或死锁!~
  346.  
  347. 【解决方法】:
  348.  
  349. 在批处理语句前加上 SET XACT_ABORT ON
  350. 当客户端中断的时候,未执行完成则回滚操作,及时释放资源。
  351.  
  352.   

SqlServer try catch 捕获不到的一些错误及解决方法(转载)的更多相关文章

  1. SqlServer try catch 捕获不到的一些错误及解决方法

    IF (OBJECT_ID('AA','U') IS NOT NULL) DROP TABLE AA CREATE TABLE AA(ID INT) SELECT * FROM AA --注:数据库当 ...

  2. Sqlserver 2008 error 40出现连接错误的解决方法

    说明(2017-5-25 15:00:16): 核心:把端口号改成1433 Sqlserver 2008 error 40出现连接错误的解决方法

  3. navicate premium连接sqlserver时报08001错误的解决方法

    ---恢复内容开始--- navicate premium连接sqlserver时报08001错误的解决方法 1.自己一直使用navicate连接sqlserver,但是自从自己的电脑安装了sqlse ...

  4. 【数据库】 Sqlserver 2008 error 40出现连接错误的解决方法

    经常要连接到远程数据库上,因此常常碰到这个错误,然后又屡次忘记解决方法,所以今天坐下笔迹,好下次能快速回忆起来. 一.首先检查数据库的TCP/TP是否启动 1.启动Sql server配置管理器 2. ...

  5. sqlserver错误126解决方法

    是不是很尴尬! 华丽的分割线下便是解决方法: 1.打开sqlserver配置管理器. 2.选择sqlserver网络配置,并禁用VIA协议确定保存. 3.在服务里面启动[SQL Server (SQL ...

  6. SqlServer try catch 捕获触发器\存储过程异常,结合 transaction 事务

    SoEasy~,贴上代码看所有 ALTER trigger [dbo].[tgr_SG_Gathering_update] on [dbo].[SG_Gathering] for update --更 ...

  7. java中异常处理机制 throw抛出自定义业务逻辑异常 throws继续抛出 catch捕获后会自动继续抛向调用方法

    package com.swift; public class Exception_TestC { public static void main(String[] args) { /* * 第5题: ...

  8. 连接WCF报EntityFramework.SqlServer 错误的解决方法

    现象: The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFram ...

  9. SQLserver 数据库高版本无法还原到低版本的数据解决方法

    sql server 数据库的版本只支持从上往下兼容.即高版本可以兼容低版本 .低版本不能兼容低版本.通常我们在开发时会用比较高的版本.但是部署到客户那边可能他们的数据库版本会比较低. 我们可以通过导 ...

随机推荐

  1. 特征检测之Haar

    Harr特征, 主要用于人脸检测,可以参考我的博文 基于MATLAB的adaboost级联形式的人脸检测实现 1 harr特征的原理 2 haar特征的计算 3 haar特征的应用

  2. jrebel实现tomcat热部署

    -noverify -javaagent:D:\jrebel.jar 注:频繁切换工程的时候,热部署可能会失效; 解决办法是:先把项目拖到tomcat下发布,然后在没有配置上面这行代码的情况下,让项目 ...

  3. 北京电子科技学院(BESTI)实验报告1

    北京电子科技学院(BESTI)实验报告1 课程: 信息安全系统设计基础 班级:1452.1453 姓名:(按贡献大小排名)郑凯杰 .周恩德 学号:(按贡献大小排名)20145314 .20145217 ...

  4. Apache rewrite

    Apache rewrite mod_rewrite简介和配置 实URL跳转隐藏真实地址 拟目录 域名跳转 防止盗链 Apache配置支持httpd.conf配置.htaccess配置 启用rewri ...

  5. css中的四个不同的position设置

    <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...

  6. POJ 1637 Sightseeing tour(混合图的欧拉回路)

    题目链接 建个图,套个模板. #include <cstdio> #include <cstring> #include <iostream> #include & ...

  7. 封装ajax

    function ajaxRequest(method,url,sync,param,responseFun){ //创建对象 var httpRequest; if(window.XMLHttpRe ...

  8. .NET面试题目

    简单介绍下ADO.NET和ADO主要有什么改进? 答:ADO以Recordset存储,而ADO.NET则以DataSet表示,ADO.NET提供了数据集和数据适配器,有利于实现分布式处理,降低了对数据 ...

  9. WCF的同步和异步(以WPF连接为例)

    2016-06-0711:05:44 在学习WCF时,学到WCF服务的同步和异步. 我理解的同步是: 当WCF服务是同步执行时,程序只有一条线程,代码只能按顺序一步一步来执行,当执行客户端/服务端某方 ...

  10. JAVA自定义异常

    创建自定义异常是为了表示应用程序的一些错误类型,为代码可能发生的一个或多个问题提供新含义. 可区分代码运行时可能出现的相似问题的一个或多个错误,或给出应用程序中一组错误的特定含义. //自定义异常类需 ...