2017-08-10 31 views
2
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 

爲什麼表變量沒有得到無效的對象名在這?表變量與溫度表

+0

請標記DBMS和版本(適用) – JohnHC

+0

SQL Server 2014 – omkar

+0

這個問題在這裏回答https://stackoverflow.com/questions/5994957/sql-server-variable-scope-in​​-a-存儲過程 – Doliveras

回答

0

我猜SQL Server足夠聰明來extraxt「declare @t table(value int)」,並先執行它,然後執行所有其他操作。這可以通過在聲明的「ELSE」部分插入「插入@t values(6)」來證明。你的第二個例子 - 具有用於臨時表的DDL的例子 - 確實是按照設計順序執行的,所以在你的例子中不會創建該對象。

1

documentation規定了:

的局部變量的範圍是在其中聲明它的批次。

說實話,我認爲範圍是其中的定義發生。我想真正的定義是範圍是從定義的角度到批處理的結束。

批次通常由GO或連接定義。

+0

是的,批次是正確的 - 但這並不能解釋,爲什麼即使「IF」沒有填滿也會聲明.... – Tyron78

+0

是的,首先它不應該進入if塊來執行declare @t表 – omkar

1

T-SQL中的變量範圍並不侷限於塊。局部變量的範圍是其聲明的批處理。

有一個請求可以聲明只在塊中可見的變量,但是Microsoft拒絕它。這裏是link