do while
在 SQL Server 2008 中是否有任何实现循环的方法?
5 回答
我不确定 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/
WHILE 循环示例
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 END GO
结果集:
1 2 3 4 5
带有 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
带有 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
注意启用的解决方案和原始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
.
自行决定使用这些,当他们发现你使用备受诟病的GOTO
.
我似乎记得不止一次地读过这篇文章,答案只是接近我所需要的。
通常当我认为我需要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 似乎没有提供比这个无限循环更简洁的方法来单独定义循环操作。
如果您希望代码更具可读性,也可以使用退出变量:
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 server 仅支持 While 循环。DO while 循环已经有了答案。我正在详细说明在 SQL Server 中实现不同类型循环的方法。
如果您知道,无论如何您都需要完成循环的第一次迭代,那么您可以尝试DO..WHILE或REPEAT..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';