132

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

4

5 回答 5

196

我不确定 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
    

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

于 2010-12-20T07:08:28.247 回答
67

如果你对关键字不是很反感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的理想选择。重点是示例的简洁性而不是适用性,因为需要/的合法案例很少见。DOWHILEDOWHILE


重复/直到,任何人(不在 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/的情况UNTILWHILE基于的解决方案更简单,因为 if 条件没有倒置。另一方面,它也更加冗长。

如果不是因为使用GOTO.

自行决定使用这些,当他们发现你使用备受诟病的GOTO.

于 2011-06-28T03:00:35.137 回答
20

我似乎记得不止一次地读过这篇文章,答案只是接近我所需要的。

通常当我认为我需要DO WHILE在 T-SQL 中使用时,这是因为我正在迭代一个游标,并且我主要在寻找最佳清晰度(相对于最佳速度)。在似乎适合WHILE TRUE/的 T-SQL 中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 似乎没有提供比这个无限循环更简洁的方法来单独定义循环操作。

于 2014-03-12T04:40:08.677 回答
4

如果您希望代码更具可读性,也可以使用退出变量:

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

当您有一个更复杂的循环并试图跟踪逻辑时,这可能会更相关。如前所述,循环很昂贵,因此如果可以,请尝试使用其他方法。

于 2015-05-07T09:25:23.910 回答
1

SQL server 仅支持 While 循环。DO while 循环已经有了答案。我正在详细说明在 SQL Server 中实现不同类型循环的方法。

如果您知道,无论如何您都需要完成循环的第一次迭代,那么您可以尝试DO..WHILEREPEAT..UNTIL版本的 SQL Server。

DO..WHILE 循环

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 循环

DECLARE @cnt INT = 0;

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

PRINT 'Done FOR LOOP';

参考

于 2017-09-22T11:08:35.150 回答