SQL Server:如何中途中断SQL查询?

时间:2018-10-16 04:24:48

标签: sql sql-server

我试图在SQL Server的表中插入数十万条记录。我想模拟数据库恢复,并且这样做,我需要在插入过程中“中断”执行。我正在使用事务开始并逐批提交插入插入。假设我提交了2万条记录,想开始另外2万条记录的交易,我想在第二批插入期间中断交易。

我知道终止执行,但是它只是停止执行,并且仍然会插入记录。它不会以任何方式使其崩溃。我需要确保在中断事务时,它不会最终被提交到数据库。

有什么办法吗?

赞赏任何建议。

2 个答案:

答案 0 :(得分:0)

  

我知道要终止执行,但这只会停止执行   执行和记录仍将被插入。它不会崩溃   任何方式。我需要确保在中断交易时   最终并没有提交到数据库。

这是错误的。 如果中断INSERT,它将回滚。 这是复制品:

create table dbo.nums(n bigint not null);
go

insert into dbo.nums 
select row_number() over (order by getdate()) as n
from sys.columns c1 cross join sys.columns c2 cross join sys.columns c3;

如果您中断此代码并执行

select * from dbo.nums;

您会发现它为空。

因此,请确保此事务在被中断后将永远不会提交。

  

假设我提交了2万条记录,并希望开始交易   对于另外2万条记录,我想中断交易   在第二批插入期间。

您可以这样做,如果您希望有更多时间来中断代码,只需添加waitfor delay

begin tran
    insert into dbo.nums 
    select row_number() over (order by getdate()) as n
    from sys.columns c1 cross join sys.columns c2 cross join sys.columns c3;

    waitfor delay '00:01:00';

...并确保它不会被提交。

答案 1 :(得分:0)

如果您需要确保何时中断事务,它最终并不会提交到数据库。您需要使用:

  SET XACT_ABORT { ON | OFF }

当Transact-SQL语句引发运行时错误时,这基本上将回滚当前事务

查看链接以获取更多信息

https://docs.microsoft.com/en-us/sql/t-sql/statements/set-xact-abort-transact-sql?view=sql-server-2017