【问题标题】:How to implement a do-while loop in tsql如何在sql中实现do-while循环
【发布时间】:2010-12-03 12:28:30
【问题描述】:

我正在尝试如何在 TSQL 中实现这一点

do 
  update stuff set col = 'blah' where that_row = 'the right one'
  select trash from stuff ...
until some_condition

Transact-SQL 提供的唯一迭代控制流语句是while (condition) sentences,它首先评估条件,如果条件为真,则执行该语句。

我正在考虑这样的场景,例如在表上执行 UPDATE 语句,直到触发了某个条件,并且实现了最后一次执行的 UPDATE。

最重要的是,我正在寻找解决这个问题的不太脏的方法(在 WHILE 之前复制 UPDATE 对我来说没有太大意义,因为 UPDATE 语句可以任意长且复杂)


编辑:我试图解决的问题涉及同一个表下的多个 UPDATE 语句,每个语句都从先前的迭代中获取和转换值。仅在一个大的 UPDATE 语句中不可能做到这一点,因为每一行只会被评估和更新一次,所以循环是我能想出让这个混乱工作的唯一方法。

【问题讨论】:

  • 如果您正在考虑对数据库代码进行流控制,那您就错了。
  • 别那么死板,有时候业务逻辑需要在存储过程中开发。
  • @rodrigo,他说的是存储过程,他说的是使用集合论而不是循环。大约 99% 的时间可以避免循环,如果可以的话,总是最好这样做。
  • @HLGEM 您是否阅读了我的问题的编辑部分?你是对的,在 99% 的情况下,正确构建的查询可以解决所有问题,我在问,因为有时你必须处理那 1% 的情况......

标签: sql sql-server tsql while-loop control-flow


【解决方案1】:

这实际上是一个 Do-While 循环:

WHILE (1=1)
  BEGIN

  -- Do stuff...

  IF (some_condition is true)
     BREAK;

  END

但正如@Joel Coehoorn 所说,始终尝试首先使用基于集合的方法。如果我想不出使用集合操作解决的方法,我只会求助于循环。

【讨论】:

  • 1 不是布尔值,而不是这个 (1=1) 可以完成这项工作。此解决方案有效且非常简单。读后感觉很明显!非常感谢。
  • @Factor Mystic :您会惊讶地看到有多少次 '1=1' 但在 where 子句的上下文中,但这是另一回事...
  • 只是想补充一点,() for while 不是必需的,除非它是某种选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-18
  • 2016-07-30
  • 2021-12-14
  • 2021-05-22
  • 2020-08-28
  • 1970-01-01
  • 2014-02-15
相关资源
最近更新 更多