2012-09-10 33 views
5

Si ejecuto lo siguiente en MS SQL 2008 R2 obtengo un resultado inesperado.Alcance de la variable de tabla dentro del cursor 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 

El resultado de la última iteración:

someValue 
ID1_ASDF 
ID2_ASDF 
ID3_ASDF 
ID4_ASDF 
ID5_ASDF 

Me haved esperaba sólo para ver

someValue 
ID5_ASDF 

Parece que la tabla @tempTable variable se mantuvo en su alcance entre las iteraciones de cursor - pero ¿cómo es posible volver a declarar la variable en cada iteración? No tiene ningún sentido para mí.

Lo resuelto por

delete @tempTable 

en cada iteración - que también respalda mi suposición sobre ello dejar de ser en su alcance.

¿Alguien puede explicar este comportamiento?

Respuesta

5

Sí, lo hace - el alcance no se define por las declaraciones begin/end, pero al final de un procedimiento almacenado o un 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

gracias, pero ¿cómo es posible volver a declarar la variable en cada iteración? – zmaster

2

Las declaraciones de variables en T -SQL son una especie de bestia extraña: las declaraciones de variables ignoran flujo de control.

Esto produce un error:

set @a = 2 

Esto funciona sin problema, y ​​no se imprime "Nunca":

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

La vida útil de una variable es desde el punto de declaración hasta que el lote completo

+0

ha, extraño. Creo que no hay ninguna razón para que me pregunte cómo es posible declarar la misma variable dos veces en los cursores cuando me muestras algo así :) – zmaster

+0

@zmaster - como las declaraciones ignoran el flujo de control, no se declaran más que una vez dentro de los bucles o cursores. Si lo hicieran, obtendrías un error y no se te permitiría declarar una variable dentro de un bucle. Si explícitamente tuvieras dos declaraciones de declaración con el mismo nombre de variable, obtendrías un error ya sea que estén en un bucle o no. – JeffO