循环内的表变量每次都没有初始化:SQL Server

8

我想知道为什么while循环中的表变量不像其他变量那样工作。表变量只创建一次,并在整个循环中使用,但其他变量每次循环增加时都会被初始化。

请查看以下代码以获取更多信息:

declare @tt int
set @tt =10
while @tt>0
begin

        declare @temptable table(id int identity(1,1),sid bigint)
        insert into @temptable 
                select @tt union all
                select @tt + 1 

                select * from @temptable 
               --delete from @temptable
                set @tt=@tt-1
end

这是个bug吗?

4个回答

5
您的前提是错误的。其他变量也不会在每次遇到声明语句时重新初始化。
set nocount on

declare @tt int
set @tt =10
while @tt>0
begin

        declare @i int

        set @i = isnull(@i,0) + 1
        print @i
        set @tt=@tt-1

end

打印
1
2
...
9
10

1
谢谢更新。当我使用变量进行测试时,我错过了isnull,这导致了我的困惑.. :( - RameshVel

4

正如预期的那样

SQL Server变量的作用域是每个批处理或整个函数/过程/触发器,而不是每个黑色/嵌套结构。

http://msdn.microsoft.com/en-us/library/ms187953.aspx:

变量的作用域是可以引用该变量的Transact-SQL语句范围。变量的作用域从声明它的点开始,直到声明它的批处理或存储过程结束。


-1

如果你想每次循环执行时加载表变量,请在循环内完成后从@Tablevariable中删除它。


-1

虽然这是一篇旧帖,但我想添加我的评论

set nocount on
declare @tt int
set @tt =10
while @tt>0
begin
        declare @i int=0
        set @i = @i + 1
        print @i
        set @tt=@tt-1
end
结果: 1 1 1 1 1 1 1 1 1 1

那是要证明什么?你在声明的末尾重新初始化了@i。 - user1664043

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接