2012-11-16 18 views
0

我想在動態查詢中創建一個臨時表並在以後使用它。它會從一個永久表創建:動態創建的臨時表不會持續

create table t (a integer); 
insert into t values (1); 

而臨時表創建是這樣的:

declare @command varchar(max) = ' 
    select * 
    into #t 
    from t 
    ; 
    select * from #t; 
'; 
execute (@command); 

當@command執行select from臨時表的作品。

現在,如果我從臨時表中選擇顯示錯誤消息:

select * from #t; 

Invalid object name '#t' 

如果它工作動態查詢之外創建臨時表:

select top 0 * 
into #t 
from t 

declare @command varchar(max) = ' 
    insert into #t 
    select * 
    from t 
'; 
execute (@command); 

select * from #t; 

是否有可能堅持一個動態創建的臨時表?

回答

1

您也可以創建全局臨時表。例如,## MyTemp。 但是,全局臨時表對所有SQL Server連接都可見。

+0

我測試過,它的工作原理。所以我想問題是動態查詢是在不同的會話或類似的東西中執行的?我不會使用全球臨時btw。 –

+0

我在一些過程中將它們與所有的字符編碼執行一起使用,表名在這裏由NEW_ID()生成。我不喜歡那樣,但是有一些長時間運行復雜程序的特殊情況。 – bummi

2

假設EXECUTE是在不同的會話中進行的。

按照MSDN here

執行一個Transact-SQL 一批

所以,你的臨時表只在SQL中被執行的範圍內存在中的命令字符串或字符串EXECUTE命令。

+0

這是因爲一個事務在不同的會話中執行,而不是由於事務本身?全球暫時存在交易。 –

+0

AFAIK所有東西都應該在同一個會話中執行,爲什麼全局臨時存在於我不知道的事務中,但是如果執行SQL是事務包裝,它們將無法生存:(您需要在本地運行)http:// sqlfiddle.com/#!3/b6819/2 – Paddy