2012-09-10 3 views
5

아래에서 MS SQL 2008 R2를 실행하면 예기치 않은 결과가 발생합니다. 마지막 반복의SQL 커서 내의 테이블 변수의 범위

create table #DataTable (someID varchar(5)) 
insert into #DataTable 
values ('ID1'),('ID2'),('ID3'),('ID4'),('ID5') 

declare @data varchar(8); 

declare myCursor cursor for 
select someID from #DataTable 

open myCursor 
FETCH NEXT FROM myCursor INTO 
@data 

WHILE(@@Fetch_Status >=0) 
BEGIN 

    declare @tempTable table (someValue varchar(10)) 

    insert into @tempTable select @data + '_ASDF' 
    select * from @tempTable  

FETCH NEXT FROM myCursor INTO 
@data 

END 

close myCursor 
deallocate myCursor 

drop table #DataTable 

결과 :

someValue 
ID1_ASDF 
ID2_ASDF 
ID3_ASDF 
ID4_ASDF 
ID5_ASDF 

I 만이 테이블 변수 @tempTable가 커서 반복 사이의 범위에 유지되는 것으로 보인다

someValue 
ID5_ASDF 

를 볼 것으로 예상 비하 -하지만 어떻게 각 반복에서 변수를 다시 선언 할 수 있습니까? 나 한테 이해가 안돼. 또한 여전히 범위 것에 대해 내 가정을 백업 -

나는 각 반복에

delete @tempTable 

하여 해결했다.

누구든지이 동작을 설명 할 수 있습니까?

답변

5

예, 그렇습니다 - 범위가 begin/end 명령문으로 정의하지만, 저장 프로 시저의 말, 또는 go

The scope of a variable is the range of Transact-SQL statements that can reference the variable. The scope of a variable lasts from the point it is declared until the end of the batch or stored procedure in which it is declared.

http://msdn.microsoft.com/en-us/library/ms187953(v=sql.105).aspx

+1

감사합니다.하지만 어떻게 각 반복에서 변수를 다시 선언 할 수 있습니까? – zmaster

2

변수 선언 T에없는 -SQL은 이상한 짐승이다. - 변수 선언 을 무시한다. 제어 흐름을 무시한다.

set @a = 2 

이 문제없이 실행하고, "절대로"인쇄하지 않습니다 :

오류가 발생합니다

if 1=0 
begin 
    print 'Never' 
    declare @a int 
end 
set @a = 2 

변수의 수명은 때까지 선언의 시점에서입니다 배치가 완료됩니다.

+0

하, 이상한. 같은 날을 보여줄 때 커서에서 같은 변수를 두 번 선언하는 것이 가능한지 궁금해 할 이유가 없다고 생각합니다 :) – zmaster

+0

@zmaster - 선언문은 제어 흐름을 무시하기 때문에 더 이상 선언되지 않습니다. 한 번 루프 또는 커서 안에 있습니다. 그렇게했다면 오류가 발생하고 루프 내부에서 변수를 선언 할 수 없습니다. 명시 적으로 동일한 변수 이름을 가진 두 개의 선언 문이있는 경우 루프에 있는지 여부에 관계없이 오류가 발생합니다. – JeffO