我正在查看开发人员的脚本,以从早于指定日期的大型表中删除所有数据。
SET @R = 1;
WHILE @R > 0
BEGIN
----Begin Transaction
DELETE TOP (100000) FROM
TBL_MYTABLE
WHERE dateCreated < @DELETEDATE;
----Commit Transaction;
SET @R = @@ROWCOUNT;
END;
对我来说很突出的一件事是他正在检查@@ ROWCOUNT的值,而不用@R变量做任何事情。该语句是否自动提交交易?还是整个WHILE循环都必须先完成?
编辑:作为后续问题,我如何确定循环的每次迭代是否正在提交,或者是否一直等到结束?
答案 0 :(得分:2)
简短的回答是:不,不是。因为没有COMMIT TRANSACTION
关键字
该示例是批量删除数据。
这里是一个示例,我们可以看到当BREAK;
的计数数量小于或等于2时,我设置了T
。
当它退出循环时,我们从T
中选择数据,我们只能看到两行。
CREATE TABLE T(
i int
);
INSERT INTO T values (1);
INSERT INTO T values (2);
INSERT INTO T values (3);
INSERT INTO T values (4);
INSERT INTO T values (5);
DECLARE @R INT = 1
SET @R = 1;
WHILE @R > 0
BEGIN
DELETE TOP (1)
FROM T
SET @R = @@ROWCOUNT;
IF((SELECT COUNT(*) FROM T)<= 2)
BREAK;
END;
SELECT * FROM T