我有一个数据库,每天使用增量数据填充,然后在每个月末将月份数据的完整下载放入系统。我们的业务希望每天都进入系统,然后在月末删除每日内容并留下完整的月份数据。我已经在下面写了这个问题,如果你能提供帮助,我会很感激。
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;
我需要在几张桌子上进行清除。
提前致谢。
答案 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。