我想在事务块中放入一些语句,以便在出现任何错误时脚本回滚。我将事务与这样的TRY
块组合在一起(并注意INSERT
语句应该通过语法错误(:
begin try
begin tran
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE TABLE [MY_DATABASE].[dbo].[MY_TABLE](
[Id] [nchar](10) NULL,
[Name] [nchar](10) NULL
) ON [PRIMARY]
insert into [MY_DATABASE].[dbo].[MY_TABLE] (Id,Name) values ('1','Vampire'), ('2')
commit tran
end try
begin catch
rollback tran
end catch
运行此语句后,我注意到我无法在管理工作室中获取其他表,并且该操作正在等待我提交。
如何更改我的事务尝试块,以便在出现任何错误时回滚到begin try
语句之前的位置?
脚本过早停止,而不是执行catch
块。 令人不满意的答案是,这是TRY/CATCH
无法处理的事情之一。
SQL Server 启动事务,创建表,然后崩溃
Msg 10709,级别 16,状态 1,第 117 行 表值构造函数中每行的列数必须相同。
离开打开的事务(这就是您无法在管理工作室中获取其他表的原因(。
begin try
begin tran
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE TABLE [dbo].[MY_TABLE](
[Id] [nchar](10) NULL,
[Name] [nchar](10) NULL
) ON [PRIMARY]
insert into [dbo].[MY_TABLE] (Id,Name) values ('1','Vampire'), ('2')
commit tran
end try
begin catch
print 'Now inside the "catch" block. You will not see this message.';
rollback tran
end catch
go
select * from MY_TABLE;
select @@trancount as TranCount;
rollback tran;
输出如下。 请注意表和打开事务的存在:
Msg 10709, Level 16, State 1, Line 117
The number of columns for each row in a table value constructor must be the same.
Id Name
---------- ----------
(0 rows affected)
TranCount
-----------
1
(1 row affected)
脚本尚未执行。它只是一个语法错误,导致脚本在执行之前引发错误。什么都没有开始执行。