取消删除查询

时间:2013-12-09 13:00:42

标签: sql-server

我执行了删除16 000 000行的查询:

delete from [table_name] 

执行后3分钟没有结果,我取消了查询。

花了一段时间取消,但最后它说“查询已取消”

这是否意味着删除了16 000 000中的任何一项?或者他们还在那里吗?

这不是真正的查询,我只是用它作为例子。

2 个答案:

答案 0 :(得分:6)

行应该在那里。如果取消该语句,则回滚删除。 完成后,即可提交更改。

答案 1 :(得分:1)

首先,如果您想确保可以成功取消查询,则需要使用事务。如果您正在使用事务并且该事务已回滚,则不会删除任何行。如果您设置了该标志(see here),管理工作室将仅使用隐式事务。

那就是说,我真的好奇,因为我认为删除操作应该是一个“原子”操作,所以我编写了以下代码来测试:

create database test_database
use test_database
go

create table sample (
  ID BIGINT IDENTITY(1,1) PRIMARY KEY,
  value VARCHAR(25)
)

declare @id int 
select @id = 1
-- up 90000 if this doesn't have enough rows
while @id >=1 and @id <= 90000
begin
    insert into sample (value) values ('abcdefg');
    select @id = @id + 1
end

-- run, but cancel in the middle
delete from sample

-- check, are there 90000 records now?
select count(id) from sample

-- clean up
drop table sample

事实证明,如果单击“取消”,它会将其视为“原子”语句,这意味着所有行仍然存在。你的环境可能会有所不同,所以要测试一下!