Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么SQL Server 2012中的变量表无法回滚?_Sql_Transactions_Sql Server 2012_Rollback - Fatal编程技术网

为什么SQL Server 2012中的变量表无法回滚?

为什么SQL Server 2012中的变量表无法回滚?,sql,transactions,sql-server-2012,rollback,Sql,Transactions,Sql Server 2012,Rollback,我已经创建了一个变量表。在我的存储过程中,有很多事务 现在,每当发生错误时,我想回滚一个特定的事务,该事务包含一些语句,这些语句可以插入、更新或删除变量表中的记录 这只是我实际问题的一个例子: declare @tab table (val int) insert into @tab select 2 insert into @tab select 3 insert into @tab select 4 select * from @tab begin tran begin try

我已经创建了一个变量表。在我的存储过程中,有很多事务

现在,每当发生错误时,我想回滚一个特定的事务,该事务包含一些语句,这些语句可以插入、更新或删除变量表中的记录

这只是我实际问题的一个例子:

declare @tab table (val int)

insert into @tab select 2
insert into @tab select 3
insert into @tab select 4

select * from @tab

begin tran
begin try
    update @tab set val = 1
    select 1/0;
    commit
end try
begin catch
    rollback
end catch

select * from @tab
实际输出:-

我的预期产出是:-


所以这里事务的回滚不起作用。为什么它不在这里工作?我做错什么了吗?

您没有使用
temp
表,您使用的是
变量
表。这是有区别的

临时表处理事务,变量表不处理事务。看

如果要将变量表
@tab
更改为
#tab
的临时表,您将获得所需的行为

临时表和变量表之间的差异:


我修改了我的问题。谢谢你的知识分享。但问题仍然是一样的。为什么它不适用于变量表


我在上面贴的链接比我能看到的更详细

我修改了我的问题。谢谢你的知识分享。但问题仍然是一样的。为什么它不适用于变量表?更新了我的答案。希望这会有所帮助。对表变量的修改会记录到
tempdb
事务日志中。但它们在每个语句之后提交的内部系统事务下运行,这些事务不参与周围的用户事务。另外一个事务包含更多关于其他差异的详细信息@MartinSmith-在Sql server:D中有什么您不知道的吗