2015-10-27 70 views
2

我正在定義一個長動態查詢,我想將它的結果插入到表中。但是,我不想首先定義表格。這可能嗎?將動態查詢結果插入未定義的臨時表中?

查詢正常工作,我看到預期的結果,如果我運行此:

declare @query VARCHAR(MAX) 
@query = 'SELECT 
       --a bunch of stuff involving joins and pivots and such 
     ' 
execute (@query) 

但這些都不能嘗試選擇到非指定臨時表的工作:

--attempt 1 
    declare @query VARCHAR(MAX) 
    @query = 'SELECT * INTO #T1 (
       SELECT 
        --a bunch of stuff involving joins and pivots and such 
       ) 
      ' 
    execute (@query) 

--attempt 2 
    declare @query VARCHAR(MAX) 
    @query = 'SELECT 
        --a bunch of stuff involving joins and pivots and such 
      ' 
    execute (@query) 
    select * INTO #T1 execute (@query) 
+0

嘗試1應該工作,但問題當然是,當執行結束時,表將被刪除 - 並且插入到...執行只適用於已定義的表 –

回答

2

一解決方法是使用全局臨時表:

SET @query = 'SELECT * INTO ##T1 FROM (
       SELECT 
        --a bunch of stuff involving joins and pivots and such 
       )'; 

EXECUTE(@query); 

SELECT * -- reasign to local temp table to avoid reserving global ##T1 name 
INTO #T1 -- if needed you can skip this part and work only on global table 
FROM ##T1; 

DROP TABLE ##T1; 

SELECT * 
FROM #T1; 

LiveDemo

正常的局部臨時表是行不通的,因爲動態SQL創建新的上下文。該表在該上下文中並且在代碼執行時將不再存在,因此您不能在Dynamic-SQL之外使用它。

+1

謝謝!這工作完美。 – ab11

+1

請記住,全局臨時表由所有會話共享,包括數據 –