Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在tsql中实现do while循环_Sql_Sql Server_Tsql_While Loop_Control Flow - Fatal编程技术网

如何在tsql中实现do while循环

如何在tsql中实现do while循环,sql,sql-server,tsql,while-loop,control-flow,Sql,Sql Server,Tsql,While Loop,Control Flow,我试图弄清楚如何在TSQL中实现这一点 do update stuff set col = 'blah' where that_row = 'the right one' select trash from stuff ... until some_condition Transact-SQL提供的唯一迭代控制流语句是而(condition)语句,它首先计算条件,如果该条件为真,则执行该语句 我想在一个场景中,比如在一个表上执行一个UPDATE语句,直到最后一次执行的更新达到某个条件

我试图弄清楚如何在TSQL中实现这一点

do 
  update stuff set col = 'blah' where that_row = 'the right one'
  select trash from stuff ...
until some_condition
Transact-SQL提供的唯一迭代控制流语句是
而(condition)语句
,它首先计算条件,如果该条件为真,则执行该语句

我想在一个场景中,比如在一个表上执行一个UPDATE语句,直到最后一次执行的更新达到某个条件为止

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



编辑:我试图解决的问题涉及同一个表下的多个UPDATE语句,每个语句都从以前的迭代中获取并转换值。这不可能只在一个大的UPDATE语句中完成,因为每一行只会被计算和更新一次,所以循环是我唯一能解决这个问题的方法。

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

WHILE (1=1)
  BEGIN

  -- Do stuff...

  IF (some_condition is true)
     BREAK;

  END

但正如@joelcoehoorn所指出的,总是首先尝试使用基于集合的方法。只有当我想不出使用集合操作解决问题的方法时,我才会求助于循环。

如果你想对数据库代码进行流控制,那你就错了。别那么死板,有时候业务逻辑需要在存储过程中开发。@rodrigo,他是;谈到它是一个存储过程,他说的是使用集合论,而不是looop。在99%的时间里可以避免循环,如果可以的话,最好这样做。@HLGEM你读过我问题的编辑部分了吗?你是对的,99%的情况下,一个正确构建的查询都能解决所有问题,我是这样问的,因为有时候你不得不处理这样的情况:1%…1不是布尔值,而不是(1=1)可以完成这项工作。此解决方案有效且非常简单。看了之后似乎很明显!非常感谢。@Factor Mystic:您可能会惊讶地看到有多少次“1=1”,但在where子句的上下文中,这是另一个故事……只是想补充一点,while()不是必需的,除非它是某种选择。