表变量 vs 临时表

3
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 

为什么表变量在此代码中不会得到无效的对象名称错误提示?

请标记数据库管理系统和版本(如适用) - JohnHC
SQL Server 2014 - omkar
1
由于相同的原因,此语句将返回一行数据。SELECT * FROM tempdb.sys.columns WHERE name = 'foobar';DECLARE @T TABLE(foobar int); - Martin Smith
我记得读过一些关于SQL Server在编译时执行declare语句而不是运行时的内容。然而这只是一个模糊的记忆,如果没有更多的研究,我不会相信它。 - Zohar Peled
显示剩余6条评论
3个回答

2

T-SQL中变量的作用域不仅限于块。局部变量的作用域是它所声明的批处理。

有人请求能够声明仅在块内可见的变量,但微软拒绝了。这里是链接


1

文档指定:

局部变量的作用域是它所声明的批处理。

说实话,我以为作用域是定义所在的。我想真正的定义应该是从定义点到批处理结束的范围。

批处理通常由GO或连接定义。


是的,批处理脚本是正确的 - 但这并不能解释为什么即使“IF”未满足也会被声明...。 - Tyron78
是的,首先它不应该进入if块来执行declare @t表。 - omkar

0

我猜SQL Server足够聪明,能够提取"declare @t table (value int)"并首先执行它,然后再执行所有其他操作。这可以通过在语句的"ELSE"部分中放置"insert into @t values(6)"来证明。你的第二个例子 - 带有临时表DDL的例子 - 确实按设计顺序执行,因此在你的例子中不会创建对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接