SQL Server 2008 R2中的临时表行为

时间:2015-12-15 08:38:14

标签: sql-server-2008-r2

我正在执行以下脚本。

declare @id int = 0

while(@id < 10)
begin
    declare @tbl as table (id int)

    insert into @tbl values(@id)
    set @id = @id + 1

    SELECT * FROM @tbl
end

我得到的结果如下。

Result

但是这个脚本每次只能在临时表中给出一行,因为临时表每次都在while循环中声明,而我只在表中插入一个值。

我不明白临时表的这种行为,请建议。

1 个答案:

答案 0 :(得分:2)

根据Transact-SQL Variables

  

变量的范围是可以引用变量的Transact-SQL语句的范围。变量的范围从声明它的位置开始持续到声明它的批处理或存储过程的结束。

每个DECLARE只是&#34;读&#34;一旦:

  • SQL Server将代码分区并在编译时读取所有DECLARE语句。
  • 然后为这些变量保留内存。
  • 然后,代码可以在尊重DECLARE的位置使用它们,直到脚本结束。

如果我们查看你的脚本,当执行第1行时,@ tbl已在内存中保留,但只有在脚本到达第5行时才能使用该变量。但是,在每次迭代时都不会一次又一次地保留它。循环。