我们最近遇到了一个类似的情况,但需要在几天内慢慢更新(每次运行仅更新特定数量的记录,只在某些时间段内进行)。最近的数据没问题,但数以百万计的旧数据需要被更新。我们的数据表看起来像这样:
Create Table FileContent
(
FileContent varchar(max),
File_PK bigint,
NewFileContent varchar(max)
)
我们只需要更新某些行,但是有数百万行。我们创建了一个表来存储我们的进度,以便我们可以使用定期作业来迭代更新主表,然后将此表填充为需要更新的主表记录的主键:
Create Table FilesToUpdate
(
File_PK bigint,
IsUpdated bit NOT NULL DEFAULT 0
)
然后我们安排了以下脚本来进行更新(为了您自己的使用,请根据您的系统调整批处理大小和计划安排)。
DECLARE @Rowcount INT = 1
, @BatchSize INT = 100
, @BatchesToRun INT = 25
, @StartingRecord BIGINT = 1;
Select @StartingRecord = MAX(File_PK) From FilesToUpdate where IsUpdated = 0
WHILE (@Rowcount > 0 and @BatchesToRun > 0)
BEGIN
print Concat('StartingRecord (Start of Loop): ', @StartingRecord)
UPDATE FileContent SET NewFileContent = 'New value here'
WHERE File_PK BETWEEN (@StartingRecord - @BatchSize + 1) AND @StartingRecord;
SET @Rowcount = @@ROWCOUNT;
print Concat('RowCount: ', @Rowcount)
UPDATE FilesToUpdate Set IsUpdated = 1 where File_PK BETWEEN (@StartingRecord - @BatchSize + 1) AND @StartingRecord;
SELECT @BatchesToRun = @BatchesToRun - 1
print Concat('Batches Remaining: ',@BatchesToRun)
SELECT @StartingRecord -= @BatchSize
print Concat('StartingRecord (End of Loop): ', @StartingRecord)
END