有没有办法在取消删除查询时禁用回滚?那么删除的哪些行仍然被删除而那些未删除的行仍然存在?
我知道它打破了ACID,但是我犯了一个错误,它已经取消了3个小时的查询...而且我不希望这些行被退回。只是为了将来再次发生这种情况,如果我取消,我就不会锁定桌子。
谢谢!
答案 0 :(得分:1)
我知道Sql Server讨厌游标,但这似乎是尝试游戏的好时机。这里有几个好处远远超过额外的处理时间:
delete
语句中执行此操作可能会长时间锁定整个表(超过某一点,Sql Server将跳过行锁定并尝试锁定整个表)。一次删除一行可以大大减轻这种锁定问题。delete
内放置try
。发生错误时,将详细信息写入日志表。这将为您提供有关导致错误的原因所需的信息,以便您可以找出解决方法。我知道Sql Server开发人员将游标视为 Evil Incarnate 。他们不是。它们是一种工具,就像任何工具都应该热情地使用,只要收益超过成本。
答案 1 :(得分:0)
不是直接没有。
通常的作用是将删除分成批处理并运行WHILE
循环,直到完成所有操作:
SET ROWCOUNT 10000
SELECT top 1 * from sys.objects --prime ROWCOUNT
WHILE @@ROWCOUNT > 0
BEGIN
DELETE FROM TABLExxx WHERE 1=0 --Delete conditions
END
一次删除10000个 1 行,因此当您取消时,您只会撤消工作的位。
1 10000完全是任意的 - 您可能希望根据您自己的数据来调高或调整此值,每批次需要多长时间以及如果您取消取消,您将失去多少工作脚本。