在 SQLServer2008中执行 while 循环

在 SQL Server 2008中是否有实现 do while循环的方法?

586499 次浏览

我对 DO-WHILE INMSSQLServer2008不是很确定,但是您可以更改您的 WHILE 循环逻辑,以便像 DO-WHILE 循环那样使用。

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

  1. WILE 循环示例

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

    结果集:

    1
    2
    3
    4
    5
    
  2. Example of WHILE Loop with BREAK keyword

    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. Example of WHILE Loop with CONTINUE and BREAK keywords

    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
    

But try to avoid loops at database level. Reference.

如果您对 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的解决方案与原始 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构造的一个很好的候选者。重点是例子的简洁性而不是适用性,因为需要 DO/WHILE的合法案例很少。


重复/直到,有人(不在 T-SQL 中工作) ?

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

以及基于 GOTO的 T-SQL 解决方案:

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

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

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的解更简单,因为 if 条件没有反转。另一方面,它也更冗长。

如果不是因为对使用 GOTO的鄙视,这些甚至可能成为 T-SQL 代码中为了清晰起见需要使用这些特殊(邪恶)循环结构时的惯用解决方案。

您可以自行决定使用这些工具,当您使用饱受诟病的 GOTO时,尽量不要让您的同事开发人员感到愤怒。

我似乎记得不止一次读过这篇文章,答案只有 差不多,我需要什么。

通常,当我认为我需要 T-SQL 中的 DO WHILE时,那是因为我在迭代一个游标,我主要是在寻找最佳清晰度(相对于最佳速度)。在 T-SQL 中,似乎符合 WHILE TRUE/IF BREAK

如果这就是你来这里的原因,这个片段可能会为你节省一点时间。否则,欢迎我回来。现在我可以确定我来过这里不止一次了。:)

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 似乎没有提供比这个无限循环更清晰的单一定义循环操作的方法。

如果希望代码更具可读性,还可以使用 exit 变量:

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

当您有一个更复杂的循环并试图跟踪逻辑时,这可能更有关系。由于指定的循环代价很高,所以如果可能的话,请尝试使用其他方法。

SQL 服务器正式支持 Only While 循环。现在已经有了用于 DO while 循环的 回答。我详细回答了在 SQL 服务器中实现不同类型循环的方法。

如果您知道,无论如何您都需要完成循环的第一次迭代,那么您可以尝试使用 SQL 服务器的 一会儿重复,直到版本。

DO. . WHILE Loop

DECLARE @X INT=1;


WAY:  --> Here the  DO statement


PRINT @X;


SET @X += 1;


IF @X<=10 GOTO WAY;

重复,直到循环

DECLARE @X INT = 1;


WAY:  -- Here the REPEAT statement


PRINT @X;


SET @X += 1;


IFNOT(@X > 10) GOTO WAY;

FOR Loop

DECLARE @cnt INT = 0;


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


PRINT 'Done FOR LOOP';

参考文献