首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何像UPDATE Top那样批量执行SQL更新?

如何像UPDATE Top那样批量执行SQL更新?
EN

Stack Overflow用户
提问于 2012-01-11 22:01:34
回答 4查看 51.8K关注 0票数 18

是否可以在SQL Update语句中添加TOP或某种分页?

我有一个UPDATE查询,结果如下所示:

代码语言:javascript
复制
UPDATE XXX SET XXX.YYY = #TempTable.ZZZ
FROM XXX
INNER JOIN (SELECT SomeFields ... ) #TempTable ON XXX.SomeId=#TempTable.SomeId
WHERE SomeConditions

此更新将影响数百万条记录,我需要分批执行。比如当时的100.000 (排序无关紧要)

做这件事最简单的方法是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-11 22:04:41

是的,我相信您可以在update语句中使用TOP,如下所示:

代码语言:javascript
复制
UPDATE TOP (10000) XXX SET XXX.YYY = #TempTable.ZZZ
FROM XXX
INNER JOIN (SELECT SomeFields ... ) #TempTable ON XXX.SomeId=#TempTable.SomeId
WHERE SomeConditions
票数 20
EN

Stack Overflow用户

发布于 2016-08-26 12:57:56

您可以执行类似以下的操作

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2012-01-11 22:08:11

根据您更改表的数据结构的能力,我建议您向表中添加一个字段,该字段可以包含某种批次标识符。即。如果你每天都这样做,它可以是一个日期戳,一个增量值,或者基本上是任何你可以使你的批处理唯一的值。如果您采用增量方法,那么您的更新将是:

代码语言:javascript
复制
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上设置索引并减少服务器上的负载。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8820553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档