2012-09-10 20 views
5

Aşağıdakileri MS SQL 2008 R2'de çalıştırırsam beklenmedik bir sonuç alırım. Geçen tekrarlamanınSQL imleç içindeki tablo değişkeninin kapsamı

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 

Sonuç:

someValue 
ID1_ASDF 
ID2_ASDF 
ID3_ASDF 
ID4_ASDF 
ID5_ASDF 

Sadece tablo değişkeni @tempTable imleç tekrarlamalar arasındaki kapsamında tutulmasını görünüyor

someValue 
ID5_ASDF 

görmeye beklenen haved - ama Her bir yinelemede bu değişkeni yeniden tanımlamak nasıl mümkün olabilir? Bana hiç mantıklı değil. Ayrıca yine kapsamında olma konusunda benim varsayım yedekler -

ben her tekrarında

delete @tempTable 

bunu çözdü.

Bu davranışı herkes açıklayabilir mi?

cevap

5

Evet, öyle - kapsam begin/end ifadeleri ile tanımlanan, ancak bir saklı prosedürün sonuna kadar ya da 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

Teşekkürler, ancak her bir yinelemede değişkeni tekrar bildirmek nasıl mümkün olabilir? – zmaster

2

Değişken bildirimleri T değildir -SQL biraz garip bir canavar - değişken bildirimleri kontrol akışını dikkate almaz.

set @a = 2 

Bu sorunu olmadan çalışır ve "Hiçbir zaman" yazdırmıyor:

Bu

bir hata üretir

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

değişkenin ömrü kadar beyanının noktadan olduğu toplu tamamlar.

+0

ha, garip. Bana bir şey gösterdiğinde aynı değişkeni imleçler içinde iki kere bildirmenin nasıl bir sebep olduğunu merak etmeme gerek yok :) – zmaster

+0

@zmaster - bildirimler denetim akışını göz ardı ettiğinden, daha fazla bildirilmiyorlar herhangi bir döngü veya imleç içinde bir kez. Eğer yapmışlarsa, bir hata alırsınız ve bir değişkenin içinde bir değişkenin bildirilmesine izin verilmez. Aynı değişken adına sahip iki açık beyanda bulunduysanız, bir döngü içinde olup olmadığına dair bir hata alırsınız. – JeffO