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

Posted

技术标签:

【中文标题】while循环内的表变量每次都没有初始化:SQL Server【英文标题】:Table variables inside while loop not initializing everytime : SQL Server 【发布时间】:2011-04-14 15:29:57 【问题描述】:

我想知道为什么 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

这是一个错误吗??

【问题讨论】:

【参考方案1】:

你的前提是错误的。其他变量也不会在每次遇到 declare 语句时都重新初始化。

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

【讨论】:

感谢更新..我在使用变量测试时错过了 isnull..这导致了我的困惑..:(【参考方案2】:

如预期的那样

SQL Server 变量范围是每个批次或整个函数/过程/触发器,而不是每个黑色/嵌套构造

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

变量的作用域是范围 的 Transact-SQL 语句,可以 引用变量。一的范围 变量从它所在的点持续 声明直到批次结束或 它所在的存储过程 声明。

【讨论】:

【参考方案3】:

虽然这是旧帖子,但只是想添加我的 cmets

设置不计数 声明@tt int 设置@tt =10 而@tt>0 开始 声明@i int=0 设置@i = @i + 1 打印@i 设置@tt=@tt-1 结尾 结果: 1 1 1 1 1 1 1 1 1 1

【讨论】:

这应该证明什么?您在声明结束时重新初始化 @i【参考方案4】:

如果您想在每次循环执行时加载表变量。一旦在循环内完成工作,就从 @Tablevariable 中删除。

【讨论】:

以上是关于while循环内的表变量每次都没有初始化:SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

JAVA,关于for循环,循环体里的问题

sqlserver怎么循环

有没有办法在不使用游标的情况下循环遍历 SQL 中的表变量?

--SQL循环查询表

foreach 循环内的 while 循环仅返回 1 行

js中的4种循环结构