使用while循环清除数据。

时间:2015-09-09 15:44:24

标签: tsql sql-server-2014

我有一个数据库,每天使用增量数据填充,然后在每个月末将月份数据的完整下载放入系统。我们的业务希望每天都进入系统,然后在月末删除每日内容并留下完整的月份数据。我已经在下面写了这个问题,如果你能提供帮助,我会很感激。

DECLARE @looper INT
DECLARE @totalindex int;

select  name, (substring(name,17,8)) as Attempt, substring(name,17,4) as [year], substring(name,21,2) as [month], create_date
into #work_to_do_for
from sys.databases d
where name like 'Snapshot%' and 
d.database_id >4 and
(substring(name,21,2) = DATEPART(m, DATEADD(m, -1, getdate()))) AND (substring(name,17,4) = DATEPART(yyyy, DATEADD(m, -1, getdate()))) 

order by d.create_date  asc


SELECT @totalindex = COUNT(*) from #work_to_do_for

SET @looper = 1 -- reset and reuse counter
WHILE (@looper < @totalindex)
    BEGIN;

set @looper=@looper+1
    END;

    DROP TABLE #work_to_do_for;

我需要在几张桌子上进行清除。

提前致谢。

2 个答案:

答案 0 :(得分:0)

如果可能的话,您使用while循环迭代删除行的脚本应该更改为基于集合的操作。关系数据库引擎擅长基于集合的操作,如

Delete dbo.table WHERE yourcolumn = 5

而不是一次迭代一个。特别是如果你将在上面的评论中指出“几百万”行。

答案 1 :(得分:0)

@rwking,您将COMMIT放在事务中的位置。我的意思是,您将所有符合条件的Delete计数保留在单个事务中,并执行一次最终的Commit吗?

我具有类似的需求类型,其中我必须批量删除,并且还要跟踪最终受影响的计数数量。 我的示例代码如下:

声明@count int
声明@deletecount int

设置@ count = 0

同时(1 = 1)
开始

开始尝试

BEGIN TRAN
从--CONDITION删除前1000名

SET @COUNT = @COUNT + @@ ROWCOUNT

IF(@@ ROWCOUNT)= 0
休息;

提交

结束观看

开始观看

回滚;
结束观看

END

设置@ deletecount = @ COUNT

上面的代码可以正常工作,但是如果回批发生在其中一个批次中,那么如何跟踪@deletecount。

相关问题