我想知道为什么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
这是一个错误吗?
答案 0 :(得分: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 :(得分:4)
正如预期的那样
SQL Server变量范围是每批次或整个函数/过程/触发器,而不是每个黑/嵌套构造
http://msdn.microsoft.com/en-us/library/ms187953.aspx:
变量的范围是范围 可以的Transact-SQL语句 引用变量。范围 变量从它的位置持续 声明直到批次结束或 它所在的存储过程 声明。
答案 2 :(得分:0)
虽然它很老,但只想添加我的评论
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 Results: 1 1 1 1 1 1 1 1 1 1
答案 3 :(得分:-1)
如果要在每次循环执行时加载表变量。一旦在循环中完成工作,就从@Table变量中删除。