在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/
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
解决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';
参考