2014-10-21 5 views
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 
END 

결과는 @t=2입니다. 내가 @i으로 바꾸면 나는 @i=41가된다. 왜 첫 번째 while 루프에 @variable이 표시됩니까? 2 번 작동합니까? @t=6이 표시되지 않아야합니까?while 루프는 어떻게 작동합니까?

내가 선택한 경우 @t 끝에 6이 표시되지만, 반복 결과가 모두 필요한 경우, 결국 @t을 입력하면 다른 결과를 얻지 못할 경우에만 마지막 결과. 결과는 1,2,3,4,5,6 모두 @t이고 최종 결과는 6으로 표시되어야합니다.

이것은 모든 @t에 대해 작성한 절차의 단순화 된 예입니다. 반복은 @i가 완전한 반복을하고, @t가 두 번째 반복을 위해 가야한다. @i는 계획대로 작동하지만 첫 번째 반복 후에 @t가 중단됩니다.

(@t = 1 인 경우 @i는 일부 테이블에서 열 1부터 40 행을 가져오고 @t = 2는 일부 테이블 ..ect에서 열 2에서 40 행을 가져 와서 @sql 문자열에 씁니다. 그녀는 루프가 깨지고 @t 루프로 들어간다. @t는 @sql 문자열을 실행해야한다. (예를 들어 뷰를 생성하므로 결국 6 개의 뷰가 있어야하지만 처음에는 @t 루프를 실행 한 후 . 휴식) 내가 알고있는 것처럼

+0

한 번만 실행하면 첫 번째 루프에 두 번째 루프를 넣으려는 목적은 무엇입니까? –

+0

모든 @t 반복에 대해 @i는 항상 매 반복을 만들고, 완료되면 @t는 다음 반복 라운드로 진행해야합니다. – theweeknd

+0

네, 그러나 첫 번째 루프 'i'는 이미 최대 40 개를 더할 것이므로 두 번째 루프에서 그 영향은 무엇입니까? –

답변

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 
+0

그 m8 :), 내 문제는, 그 결과를 모든 결과가 @t 및 최종 결과뿐만 아니라 그 코드를 작성하는 방법을 알고있다. 요약본을 편집하여 끝 부분을 읽었으므로 더 잘 이해할 수 있습니다. – theweeknd

+0

@print로 할 수 있다면 좋은 시작이 될 수도 있고 내 문제에 대한 대답 일 수도 있습니다. – theweeknd

+0

왜 임시 테이블에 값을 삽입하지 않습니까? 그런 다음 루프가 종료 된 후 임시 테이블을 선택하십시오. – Bobby

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 
관련 문제