如何在T-SQL中实现一个do-while循环

33

我正试图弄清楚如何在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语句执行此操作,因为每行将仅被评估和更新一次,因此循环是我能想出使其有效的唯一方式。


4
如果你在考虑数据库代码的流程控制,那么你做错了。 - Joel Coehoorn
4
有时候业务逻辑需要在存储过程中开发,所以不要太死板。 - Rodrigo
@rodrigo,他谈论的不是存储过程,而是使用集合理论而不是循环。大多数情况下可以避免循环,如果可以的话,始终最好这样做。 - HLGEM
@HLGEM,你有没有看到我问题的编辑部分?你说得对,99%的情况下,一个正确构建的查询就可以解决所有问题,但有时候你必须处理那1%的情况... - Rodrigo
1个回答

48

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

WHILE (1=1)
BEGIN
  
  -- Do stuff...

  IF (some_condition is true)
     BREAK;

END

但是就像@Joel Coehoorn指出的那样,首先尝试使用基于集合的方法。只有在无法想到使用集合操作来解决问题时才会退而求其次使用循环。


1
1 不是布尔值,可以使用 (1=1) 来代替。这个解决方案很有效且非常简单。读完后似乎很显然!非常感谢。 - Rodrigo
1
只是想补充一下,while 的 () 只有在某种选择情况下才是必需的。 - Cody Konior

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接