如何在sql server 2005中的try catch中捕获错误时阻止事务回滚

时间:2012-12-27 14:21:36

标签: sql-server sql-server-2005 try-catch sqltransaction

我有一个带有记录的表1

Table1
-------------------------------
ID  F1
-------------------------------
01  1
02  OK
03  52
04  53
05  Null
------------------------------

这里我想将F1 Varchar的数据类型更改为Decimal(3,0); 然后我创建一个新结构的新表。

我想通过显式地将varchar转换为decimal来插入旧表的每个recod。 所以我在try catch块中写这个命令。如果生成错误,那么在catch块中我可以用它的默认值填充它。 但这整个工作是在begin transaction和commit transaction block之间执行的。 因此,如果在catch块中发现错误,则无法执行任何工作,发生错误

  

当前事务无法提交,也无法支持写入日志文件的操作。回滚交易。

即使在try catch块中发生错误,如何防止此事务回滚。

2 个答案:

答案 0 :(得分:2)

你做不到。您必须始终check the XACT_STATE and act accordingly

  

无法提交的交易和XACT_STATE
  如果在a中生成错误   TRY块导致当前事务的状态   无效,该交易被归类为不可置信   交易。通常在TRY之外结束交易的错误   阻止导致事务进入不可提交状态时   TRY块内发生错误。不可提交的交易只能   执行读操作或ROLLBACK TRANSACTION。交易   无法执行任何会生成写入的Transact-SQL语句   操作或COMMIT TRANSACTION。 XACT_STATE函数返回一个   如果事务已被归类为不可提交,则值为-1   交易。批处理完成后,数据库引擎将回滚任何批处理   积极的不可提交的交易。如果没有发送错误消息   批次时,交易进入不可提交的状态   完成后,将向客户端应用程序发送一条错误消息。   这表明检测到了不可提交的事务   回滚。

答案 1 :(得分:0)

不幸的是,SQL SERVER无法实现这一点。

任何错误都会导致事务失败,并且无法提交注定的事务,也无法将其展开到保存点。

唯一的解决方案是:使用另一个数据库引擎......