SQL游标中表变量的范围

zma*_*ter 5 sql scope temp-tables cursor table-variable

如果我在MS SQL 2008 R2中运行以下内容,我会得到意外的结果.

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
Run Code Online (Sandbox Code Playgroud)

最后一次迭代的结果:

someValue
ID1_ASDF
ID2_ASDF
ID3_ASDF
ID4_ASDF
ID5_ASDF
Run Code Online (Sandbox Code Playgroud)

我原以为只会看到

someValue
ID5_ASDF
Run Code Online (Sandbox Code Playgroud)

似乎表变量@tempTable保持在游标迭代之间的范围内 - 但是如何在每次迭代中重新声明变量?对我毫无意义.

我解决了

delete @tempTable
Run Code Online (Sandbox Code Playgroud)

在每次迭代中 - 这也支持了我关于它仍在范围内的假设.

谁能解释这种行为?

pod*_*ska 5

是的,确实如此 - 范围不是由begin/ endstatements 定义的,而是由存储过程的结尾定义的,或者是go

变量的范围是可以引用变量的Transact-SQL语句的范围.变量的范围从声明它的位置延迟到声明它的批处理或存储过程的结尾.

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