2

我有一个包含记录的表 Table1

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

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

我想通过将 varchar 显式转换为十进制来将旧表的每个记录插入到新表中。所以我在 try catch 块中写这个命令。如果产生错误,那么在 catch 块中我可以用它的默认值填充它。但是这整个工作是在开始事务和提交事务块之间执行的。因此,当 catch 块中捕获到错误时,无法执行进一步的工作,就会发生错误

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

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

4

2 回答 2

3

你不能。您必须始终检查 XACT_STATE 并采取相应措施

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

于 2012-12-27T14:25:47.920 回答
0

不幸的是,这对于 SQL SERVER 是不可能的。

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

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

于 2014-02-21T15:17:52.930 回答