do while
在SQL Server 2008中是否有实现循环的方法?
do while
在SQL Server 2008中是否有实现循环的方法?
Answers:
我不确定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
,那么为清楚起见,在T-SQL代码中有必要使用这些特定的(邪恶的)循环结构时,对于某些时候,这些甚至可能是惯用的解决方案。
您可以自行决定使用这些工具,以免当其他开发人员抓住您使用的恶意软件时遭受您的愤怒GOTO
。
我似乎记得不止一次阅读本文,而且答案仅与我所需要的接近。
通常,当我认为我需要使用DO WHILE
T-SQL时,是因为我要遍历游标,而我主要是在寻求最佳清晰度(相对于最佳速度)。在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似乎没有提供比这种无限循环更干净的方法来单独定义循环操作。
如果希望代码更具可读性,也可以使用退出变量:
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正式支持Only While Loop。已经有答案了 DO循环的。我正在详细说明在SQL Server中实现不同类型的循环的方法的答案。
如果您知道,无论如何都需要完成循环的第一次迭代,那么您可以尝试SQL Server的DO..WHILE或REPEAT..UNTIL版本。
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;
DECLARE @cnt INT = 0;
WHILE @cnt < 10
BEGIN
PRINT 'Inside FOR LOOP';
SET @cnt = @cnt + 1;
END;
PRINT 'Done FOR LOOP';