2015-03-31 25 views
2

我有以下查詢:不知道臨時表時使用SQL Server執行

if OBJECT_ID('tempdb..#tmpTables') is not null 
    drop table #tmpTables 
Execute('select TABLE_NAME into #tmpTables from '[email protected]+'.INFORMATION_SCHEMA.TABLES') 

while (select COUNT(*) from #tmpTables)>0 
begin 
    //here is my statement 
end 

當我執行此查詢時,我收到此錯誤:

無效的對象名稱# tmpTables'。

但是,當查詢更改爲此:

if OBJECT_ID('tempdb..#tmpTables') is not null 
    drop table #tmpTables 
select TABLE_NAME into #tmpTables from INFORMATION_SCHEMA.TABLES 
while (select COUNT(*) from #tmpTables)>0 
begin 
    //here is my code 
end 

它的工作原理。

我該怎麼做?

+0

,你需要把引用它在動態SQL代碼的其餘部分,因爲它只能在執行完成之前一直存在。爲什麼不在每個數據庫中創建相同的存儲過程,那麼代碼不必關心數據庫上下文或動態SQL,只有調用者必須確定要使用的正確數據庫。 – 2015-03-31 11:11:41

回答

0

帶有單個數字符號(#)前綴的表名稱是「本地臨時表」名稱。

本地臨時表僅在創建者或引用表時與其創建者在與SQL Server實例相同的連接期間纔可見。
用戶從SQL Server實例斷開連接後,將刪除本地臨時表。

而當您通過EXEC()命令創建Local Temporary Table命令時,創建者將不會是您,並且在完成語句後它將斷開連接,並且在完成連接時臨時表被刪除。


您可以使用像這樣的表變量:如果您在創建動態SQL範圍#temp表

DECLARE @tmpTables TABLE(TABLE_NAME nvarchar(max)) 

insert into @tmpTables 
(select TABLE_NAME from INFORMATION_SCHEMA.TABLES)