我有一个带有记录的表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块中发生错误,如何防止此事务回滚。
答案 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无法实现这一点。
任何错误都会导致事务失败,并且无法提交注定的事务,也无法将其展开到保存点。
唯一的解决方案是:使用另一个数据库引擎......