Search code examples
sqlscopetemp-tablesdatabase-cursortable-variable

Scope of table variable within SQL cursor


If I run the below in MS SQL 2008 R2 I get an unexpected result.

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

Result of the last iteration:

someValue
ID1_ASDF
ID2_ASDF
ID3_ASDF
ID4_ASDF
ID5_ASDF

I haved expected only to see

someValue
ID5_ASDF

It seems that the table variable @tempTable is kept in scope between cursor iterations - but how is it then possible to re-declare the variable in each iteration ? Makes no sense to me.

I solved it by

delete @tempTable

in each iteration - which also backs up my assumption about it still being in scope.

Can anyone explain this behavior ?


Solution

  • Yes, it does - the scope isn't defined by the begin / end statements, but by the end of a stored procedure, or a 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