while循环如何工作?

时间:2014-10-21 07:38:53

标签: sql tsql sybase-iq

declare @t INT = 1 
declare @i INT = 1 

    while @t <= 5
BEGIN 
    while @i <= 40 
BEGIN 
    set @i = @i + 1
END

    set @t = @t + 1
    select @t
END

我得到的结果是@t=2。如果我将其替换为@i,我会获得@i=41。为什么第一个while循环中的@variable显示为2,是否会制动?它应该不显示@t=6吗?

如果我将选择@t放在最后它将显示6,但是如果您需要迭代的每个结果,如果您将@t放在后面,那么您将无法得到其他结果结束,你只会得到最后的结果。我希望结果1,2,3,4,5,6全部通过@t,最终结果只显示6。

这是我编写的过程的简化示例,对于每个@t迭代,@ i进行完整迭代,然后@t应该进行第二次迭代。 @i按计划工作,但@t在第一次尝试后中断。

(如果@t = 1,@ i从某个表中获取第1列中的40行,@ t = 2,它从某个table..ect中获取第2列中的40行)并将其写入@sql字符串,当她当循环中断并进入@t循环时,得到40,@ t应该执行@sql字符串(例如它创建一个视图,所以最后我应该有6个视图,但是在第一次执行@t循环之后。)

2 个答案:

答案 0 :(得分:1)

您可以将结果存储在表变量中。

DECLARE @t INT = 1 
DECLARE @i INT = 1 

DECLARE @Result table(Id int)

while @t <= 5
BEGIN 
  while @i <= 40 
  BEGIN 
    set @i = @i + 1
  END

  INSERT INTO @Result(Id) values(@t)
  set @t = @t + 1

END
select Id FROM @Result

答案 1 :(得分:0)

据我了解,您应该:

DECLARE @t INT = 1 
DECLARE @i INT = 1 

while @t <= 5
BEGIN 
  while @i <= 40 
  BEGIN 
    set @i = @i + 1
  END

  set @t = @t + 1
  --select @t   <-- this is breaking the loop before it ends
END
select @t