经过两天的批量测试,回滚并尝试..catch,我的想法仍然模糊。为了澄清我的问题,我将我正在做的事情分为两步。
1. 回滚批处理 正如网上书所解释的,在批处理中,执行的语句不能只回滚,除非批处理在事务中并且批处理中的错误导致事务回滚。
所以我将批次放入交易中
begin transaction
create table A ...
insert into A values...
insert into A values... (error here!)
insert into A values...
GO
rollback
这适用于错误输出并且没有创建表
(1 row(s) affected)
Msg 213, Level 16, State 1, Line 5
Column name or number of supplied values does not match table definition.
Msg 208, Level 16, State 1, Line 1
Invalid object name 'A'.
然而,即使事务中没有错误,回滚也会被执行。为了处理这种情况,我在 2 中使用 TRY ...CATCH。
2. 使用 TRY ...CATCH
BEGIN TRY
begin transaction
create table A ...
insert into A values...
insert into A values... (error here!)
insert into A values...
--GO
END TRY
BEGIN CATCH
ROLLBACK
END CATCH
这次它不再允许语句 GO 在这里了。S* o 在这种情况下,批次是BEGIN TRY
AND之间的整个块END TRY
?* 另外,结果并不如我所愿。AND第CREATE TABLE
一个插入仍然执行并且没有回滚。我又找了一遍。看来我需要SET XACT_ABORT ON
在触摸提交之前将这些执行的语句记录为未提交。我在这里的理解是对的吗?如果是这样,在这种情况下我没有添加任何提交语句。
顺便说一句,测试是在 SQL SERVER 2012 上完成的。感谢您的澄清!