【问题标题】:How can I create a loop on an UPDATE statement that works until there is no row left to update?如何在 UPDATE 语句上创建一个循环,直到没有行可更新?
【发布时间】:2012-01-29 18:17:13
【问题描述】:

假设我有数千行要更新。

我计划迭代地进行更新;每次迭代只更新 1000 行。

我想迭代,直到没有剩余的行要更新。

如何运行下面的 T-SQL 脚本,直到没有要更新的行?

-- TODO: Create a loop so that it exists when there is no ROW left to be updated; 
-- how can I do it?

UPDATE tableToUpdate
SET IsVegetable = 1
WHERE Id IN
               (SELECT TOP 1000 Id
                FROM tableToUpdate
                WHERE Date = '2011-07-23 14:00')

-- Loop ends

【问题讨论】:

  • 为什么每次最多只更新 1000 个?对我来说,删除 WHERE 子句似乎可以解决您的问题。但你具体说你想一次做 1000 次,我只是想知道为什么?
  • 我以数字为例,但原因是为了防止事务超时。次要原因是:对实现的好奇。

标签: sql sql-server tsql dynamic-sql


【解决方案1】:

试试这个循环

while 1 = 1
BEGIN
    UPDATE top (1000) tableToUpdate
    SET IsVegetable = 1
    WHERE 
        Date = '2011-07-23 14:00'
    AND IsNull(IsVegetable, 0) = 0

    if @@ROWCOUNT < 1000 BREAK
END

为什么 ISNULL - 因为不清楚 - IsVegetable 字段是否可以为空,如果不是 - 那么 ISNULL 不需要

当 IsVegetable 1 不会留下任何行时 - 循环将退出,因为 @@ROWCOUNT 将 = 0 或

【讨论】:

  • 你能解释一下,你为什么需要这个:AND IsNull(IsVegetable, 0) = 0
  • 你能解释一下确保循环工作到剩下 0 行的机制吗?
  • @Oleg:谢谢奥列格!所以看来我无法从 WHILE 语句中达到 @@ROWCOUNT 值?
猜你喜欢
  • 1970-01-01
  • 2013-08-05
  • 2018-11-03
  • 2018-08-23
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
  • 2021-03-29
相关资源
最近更新 更多