在SQL Server 2008中执行while循环

在SQL Server 2008中执行do while循环有没有什么方法?

我不确定在MS SQL Server 2008的DO-WHILE,但你可以改变你的WHILE循环逻辑,以便像DO-WHILE循环一样使用。

例子从这里被采取: http : //blog.sqlauthority.com/2007/10/24/sql-server-simple-example-of-while-loop-with-continue-and-break-keywords/

  1. WHILE循环的例子

     DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 END GO 

    结果集:

     1 2 3 4 5 
  2. 使用BREAK关键字的WHILE循环示例

     DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 IF @intFlag = 4 BREAK; END GO 

    结果集:

     1 2 3 
  3. 带有CONTINUE和BREAK关键字的WHILE循环示例

     DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 CONTINUE; IF @intFlag = 4 -- This will never executed BREAK; END GO 

    结果集:

     1 2 3 4 5 

但是尽量避免在数据库级别的循环 。 参考 。

如果你对GOTO关键字不是非常冒犯的话,它可以用来模拟T-SQL中的DO / WHILE 。 考虑下面用伪代码写的非常荒谬的例子:

 SET I=1 DO PRINT I SET I=I+1 WHILE I<=10 

以下是使用goto的等效T-SQL代码:

 DECLARE @I INT=1; START: -- DO PRINT @I; SET @I+=1; IF @I<=10 GOTO START; -- WHILE @I<=10 

注意启用GOTO解决scheme和原始的DO / WHILE伪代码之间的一对一映射。 使用WHILE循环的类似实现如下所示:

 DECLARE @I INT=1; WHILE (1=1) -- DO BEGIN PRINT @I; SET @I+=1; IF NOT (@I<=10) BREAK; -- WHILE @I<=10 END 

现在,你当然可以把这个特殊的例子改写成一个简单的WHILE循环,因为这对DO / WHILE结构来说不是一个好的select。 重点在于简洁而不是适用性,因为需要DO / WHILE合法案例很less。


REPEAT / UNTIL,任何人(不在T-SQL中工作)?

 SET I=1 REPEAT PRINT I SET I=I+1 UNTIL I>10 

…和T-SQL中基于GOTO的解决scheme:

 DECLARE @I INT=1; START: -- REPEAT PRINT @I; SET @I+=1; IF NOT(@I>10) GOTO START; -- UNTIL @I>10 

通过创造性地使用GOTO和通过NOT关键字进行逻辑反转,原始伪代码和基于GOTO的解决scheme之间有非常密切的关系。 使用WHILE循环的类似解决scheme如下所示:

 DECLARE @I INT=1; WHILE (1=1) -- REPEAT BEGIN PRINT @I; SET @I+=1; IF @I>10 BREAK; -- UNTIL @I>10 END 

对于REPEAT / UNTIL的情况可以这样说,基于WHILE的解决scheme比较简单,因为if条件没有被反转。 另一方面也是比较冗长的。

如果不是对GOTO的使用感到鄙视的话,那么为了清楚起见,在T-SQL代码中这些特殊的(邪恶的)循环结构是必须的时候,这些甚至可能是那些less数几次惯用的解决scheme。

使用这些自行决定,试图不要让你的开发人员的愤怒,当他们赶上你使用了大量的恶意GOTO

我似乎不止一次回顾这篇文章,答案只是接近我所需要的。

通常当我想在T-SQL中需要DO WHILE ,这是因为我正在迭代一个游标,而且我正在寻求最佳的清晰度(最佳速度)。 在似乎适合WHILE TRUE / IF BREAK T-SQL中。

如果这是你带来的场景,这个片段可能会为你节省一点时间。 否则,欢迎回来,我。 现在我可以肯定我不止一次来过这里。 🙂

 DECLARE Id INT, @Title VARCHAR(50) DECLARE Iterator CURSOR FORWARD_ONLY FOR SELECT Id, Title FROM dbo.SourceTable OPEN Iterator WHILE 1=1 BEGIN FETCH NEXT FROM @InputTable INTO @Id, @Title IF @@FETCH_STATUS < 0 BREAK PRINT 'Do something with ' + @Title END CLOSE Iterator DEALLOCATE Iterator 

不幸的是,T-SQL似乎并没有提供一个更清晰的方式来单独定义循环操作,而不是这个无限循环。

你也可以使用一个退出variables,如果你想让你的代码更具可读性:

 DECLARE @Flag int = 0 DECLARE @Done bit = 0 WHILE @Done = 0 BEGIN SET @Flag = @Flag + 1 PRINT @Flag IF @Flag >= 5 SET @Done = 1 END 

当你有一个更复杂的循环,并试图跟踪逻辑,这可能会更相关。 如上所述,循环是昂贵的,所以如果可以的话尝试使用其他方法。

只有While循环由SQL服务器正式支持。 循环中已经有DO的答案 。 我详细回答了在SQL Server中实现不同types循环的方法。

如果你知道,无论如何你都需要完成循环的第一次迭代,那么你可以尝试DO..WHILE或者REPEAT..UNTIL版本的SQL服务器。

DO..WHILE循环

 DECLARE @X INT=1; WAY: --> Here the DO statement PRINT @X; SET @X += 1; IF @X<=10 GOTO WAY; 

REPEAT..UNTIL循环

 DECLARE @X INT = 1; WAY: -- Here the REPEAT statement PRINT @X; SET @X += 1; IFNOT(@X > 10) GOTO WAY; 

FOR循环

 DECLARE @cnt INT = 0; WHILE @cnt < 10 BEGIN PRINT 'Inside FOR LOOP'; SET @cnt = @cnt + 1; END; PRINT 'Done FOR LOOP'; 

参考