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的主要内容,如果未能解决你的问题,请参考以下文章