是否可以在SQL Update语句中添加TOP或某种分页?
我有一个UPDATE
查询,结果如下所示:
UPDATE XXX SET XXX.YYY = #TempTable.ZZZ
FROM XXX
INNER JOIN (SELECT SomeFields ... ) #TempTable ON XXX.SomeId=#TempTable.SomeId
WHERE SomeConditions
此更新将影响数百万条记录,我需要分批执行。比如当时的100.000 (排序无关紧要)
做这件事最简单的方法是什么?
发布于 2012-01-11 22:04:41
是的,我相信您可以在update语句中使用TOP,如下所示:
UPDATE TOP (10000) XXX SET XXX.YYY = #TempTable.ZZZ
FROM XXX
INNER JOIN (SELECT SomeFields ... ) #TempTable ON XXX.SomeId=#TempTable.SomeId
WHERE SomeConditions
发布于 2016-08-26 12:57:56
您可以执行类似以下的操作
declare @i int = 1
while @i <= 10 begin
UPDATE top (10) percent
masterTable set colToUpdate = lt.valCol
from masterTable as mt
inner join lookupTable as lt
on mt.colKey = lt.colKey
where colToUpdate is null
print @i
set @i += 1
end
--one final update without TOP (assuming lookupTable.valCol is mostly not null)
UPDATE --top (10) percent
masterTable set colToUpdate = lt.valCol
from masterTable as mt
inner join lookupTable as lt
on mt.colKey = lt.colKey
where colToUpdate is null
发布于 2012-01-11 22:08:11
根据您更改表的数据结构的能力,我建议您向表中添加一个字段,该字段可以包含某种批次标识符。即。如果你每天都这样做,它可以是一个日期戳,一个增量值,或者基本上是任何你可以使你的批处理唯一的值。如果您采用增量方法,那么您的更新将是:
UPDATE TOP (100000) XXX SET XXX.BATCHID = 1, XXX.YYY = ....
...
WHERE XXX.BATCHID < 1
AND (rest of WHERE-clause here).
下一次,您将设置BATCHID =2和WHERE XXX.BATCHID < 2
如果要重复执行此操作,则可以在BATCHID上设置索引并减少服务器上的负载。
https://stackoverflow.com/questions/8820553
复制相似问题