2014-02-14 2 views
0

저는 while 루프가 간단하고 반복문 내에서 하나의 열로 DECLARE @TABLE을 선언하고 그 데이터 유형은 id입니다. 루프가 레코드를 루프하는 동안 나는 테이블 변수에 값을 삽입하고 있습니다. 루프가 루프 할 때마다 Declare @TABLE을 다시 만들어야하며 이전 값이 없어야합니다. 그러나 그 일은 일어나지 않습니다. 아래는while 루프에서 테이블을 다시 만들지 않기를 선언합니다.

1 

2 

3 

로 출력을 받아야 정상에서 코드

Declare @V int 
Set @V = 1 

While (@V <= 3) 
begin 

    DECLARE @Changes table 
    (
    Id int 
) 

    Insert into @Changes 
    Values (@V) 

    select * from @Changes 

    SET @[email protected]+1 
END 

하지만 난이 무엇입니까 출력이 잘못

1 

1 
2 

1 
2 
3 

입니다.

이것은 일반적인 동작 또는 SQL의 버그입니까?

+1

루프 외부로 선언하고 루프의 시작 부분에서 그것을 잘라. –

답변

1

이것은 정상적인 동작입니다. T-SQL은 매우 이상한 언어입니다. 변수 선언은 변수를 참조 할 수있는 경우 영향을 미치지 만 실제로는 제어 흐름에 참여하지 않습니다.

고려 :

IF 1 = 0 
BEGIN 
    DECLARE @a int 
END 

SET @a = 1 
PRINT @a 

실제로는 선언되지 않은 변수에 대해 불평하지 않습니다 1. 인쇄합니다. 각 루프의 시작에 비어있는 @Changes를 원하는 경우

로 앨런이 코멘트에 주목, 그렇게합니다

Declare @V int 

DECLARE @Changes table 
(
    Id int 
) 
Set @V = 1 

While (@V <= 3) 
begin 
    delete from @Changes 

    Insert into @Changes 
    Values (@V) 

    select * from @Changes 

    SET @[email protected]+1 
END 
+0

대답은 테이블을 삭제해야한다는 것을 알았지 만 그것은 정상적인 시나리오가 아니어야합니다. 나는 그것의 SQL 버그를 생각하니 ?? – user3309172

+0

@ user3309172 - 버그가 아니며 T-SQL 언어가 작동하는 방식입니다. 'DECLARE'는 변수를 소개합니다. 배치에서 그 시점부터 그 변수를 사용할 수 있습니다. 'DECLARE'가 어떻게/중첩되어 있는지는 중요하지 않으며, 말하자면'IF' 나'WHILE'와 같은 제어 흐름에 참여하지 않습니다. –