如何批量执行SQL UPDATE,如Update Top?

Eri*_*ker 18 sql t-sql sql-server-2008

是否可以在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
Run Code Online (Sandbox Code Playgroud)

此更新将影响数百万条记录,我需要批量执行此操作.像当时的100.000(排序无关紧要)

最简单的方法是什么?

Eri*_*lje 20

是的,我相信您可以在更新声明中使用TOP,如下所示:

UPDATE TOP (10000) XXX SET XXX.YYY = #TempTable.ZZZ
FROM XXX
INNER JOIN (SELECT SomeFields ... ) #TempTable ON XXX.SomeId=#TempTable.SomeId
WHERE SomeConditions
Run Code Online (Sandbox Code Playgroud)

  • `TOP`按什么排序?第二批如何在第一批完成后取出? (9认同)
  • @Martin - `TOP`运算符不需要`ORDER BY`,因此可能是聚簇索引顺序.至于让第二个批次在第一个批次停止的地方,你需要在你的`WHERE`子句中过滤掉已经更新过的记录.虽然不知道有关他的查询的更多信息,但很难确切地说出会是什么样子. (3认同)

Mic*_*aga 5

您可以使用SET ROWCOUNT { number | @number_var }它来限制在停止特定查询之前处理的行数,例如:

SET ROWCOUNT 10000 -- define maximum updated rows at once

UPDATE XXX SET 
    XXX.YYY = #TempTable.ZZZ
FROM XXX
INNER JOIN (SELECT SomeFields ... ) #TempTable ON XXX.SomeId = #TempTable.SomeId
WHERE XXX.YYY <> #TempTable.ZZZ and OtherConditions

-- don't forget about bellow 
-- after everything is updated
SET ROWCOUNT 0
Run Code Online (Sandbox Code Playgroud)

我添加了XXX.YYY <> #TempTable.ZZZto where子句以确保您不会更新两次已更新的值.

设置ROWCOUNT0 关闭的限制-不要忘记它.

  • 不推荐使用SET ROWCOUNT来限制UPDATE,INSERT和DELETE语句.从SQL 2005开始,应该使用TOP. (2认同)