【发布时间】:2021-01-15 14:33:34
【问题描述】:
我正在使用 SQL Azure 并尝试对大表进行批量条件删除,示例:
DECLARE
@LargestKeyProcessed BIGINT =1,
@NextBatchMax BIGINT,
@msg varchar(max) ='';
WHILE (@LargestKeyProcessed <= 1000000)
BEGIN
Begin Transaction
SET @NextBatchMax = @LargestKeyProcessed + 50000;
DELETE From mytable
WHERE Id > @LargestKeyProcessed AND Id <= @NextBatchMax And some logic
SET @LargestKeyProcessed = @NextBatchMax;
set @msg=''+@LargestKeyProcessed;
RAISERROR(@msg, 0, 1) WITH NOWAIT
Commit Transaction
END
命令成功执行后,我关闭选项卡,但 SSMS 说有未提交的事务,尽管提交语句在每次迭代中。此外,数据库大小似乎保持不变。
恳请您支持解释为什么会发生这种情况
非常感谢
【问题讨论】:
-
在引发错误之前回滚事务。
-
@GordonLinoff 我怀疑 Techy 正在尝试使用
RAISERROR(@msg, 0, 1) WITH NOWAIT就像PRINT语句在批次进行时获得即时反馈。 Severity=0 不应该影响事务,但要确保我会在提交后移动它。 -
每个语句都在事务中运行。如果您没有打开一个,默认情况下 SQL Server 会打开一个,让语句运行,然后自动提交。通过手动有效地完成相同的工作,您实际上并没有获得太多收益。
-
implicit_transactions是开还是关? -
愚蠢的故障排除想法——将“DELETE”更改为“SELECT COUNT(*)”时会得到什么?这是为了确保您实际上获得了与您的 WHERE 条件匹配的行。如果你得到零——那么问题就出在 WHERE 上。
标签: sql sql-server azure-sql-database ssms