表变量与临时表

时间:2017-08-10 10:05:42

标签: sql sql-server sql-server-2014

declare  @i int = 1
if (@i= 2)
Begin 
    declare @t table (value int)
    insert into @t 
    select 1
    select * from @t
end
else 
    select *from @t  
---------------
declare  @i int = 1
if (@i= 2)
Begin 
    create table #t(value int)
    insert into #t
    select 1
end
else 
    select *from #t 

为什么表变量没有得到无效的对象名?

3 个答案:

答案 0 :(得分:2)

T-SQL中变量的范围不限于块。局部变量的范围是声明它的批处理。

有一个请求可以声明仅在块中可见的变量,但Microsoft拒绝了它。这是link

答案 1 :(得分:1)

documentation指定:

  

局部变量的范围是声明它的批处理。

说实话,我认为范围是发生定义的。我认为真正的定义是范围是从定义点到批处理结束。

批次通常由GO或连接定义。

答案 2 :(得分:0)

我猜SQL Server足够聪明,可以将“声明@t表(值为int)”外接并先执行它然后执行所有其他操作。这可以通过在语句的“ELSE”部分中插入“插入@t values(6)”来证明。您的第二个示例 - 具有临时表的DDL的示例 - 确实按设计顺序执行,因此在您的示例中不会创建对象。