2010-03-30 63 views
1

我導入查詢的中間結果,用於進一步使用一個臨時表,所以就用一個#temp表,以保持相同的模式動態創建#temp表,然後用於插入數據

select * into # temp from schema.tableName where 1<>1; 

insert into # temp from exec(table) 

雖然我做的這個語句作爲變量傳遞不同的tablename它不工作

SET @TEMPSCHEMA = 'SELECT * INTO #temp FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1;' 

exec(@TEMPSCHEMA) 


INSERT INTO #temp 

EXEC (@SELECTSTATEMENT 

) 

但是exec語句後,沒有采取傳統價值觀來臨時表。

它示出了無效的對象ID #TEMP

+0

如果您運行@selectstatement確實是返回行嗎? – 2010-03-30 03:42:37

回答

3

這是因爲EXEC聲明的範圍是含有存儲過程的範圍不同。也就是說,您撥打EXEC正在創建臨時表,然後當EXEC的作用域保留時,它將自動刪除。基本上,你所要做的整批一個EXEC語句中:

DECLARE @sql VARCHAR(MAX) 
SET @sql = 'SELECT * INTO #temp 
      FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1 
      INSERT INTO #temp ...' 

EXEC(@sql) 
1

一旦動態SQL執行完畢,局部臨時表超出範圍。

你不得不做這樣的事情,而不是:

-- everything w/ dynamic sql 
SET @TEMPSCHEMA = ' 
    SELECT * INTO #temp FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1; 
    INSERT INTO #temp EXEC (@SELECTSTATEMENT) 
    SELECT .... -- whatever else you need to do 
    ' 

exec sp_executesql @TEMPSCHEMA, N'@SELECTSTATEMENT NVARCHAR(MAX)', @SELECTSTATEMENT 

-- global temp table rather than local 
SET @TEMPSCHEMA = 'SELECT * INTO ##temp FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1;' 
exec(@TEMPSCHEMA) 

INSERT INTO ##temp EXEC (@SELECTSTATEMENT) 
+0

感謝你們所有人, 我用了golbal temp table解決了我的問題。 很好學習全部 謝謝 prav – prav 2010-03-30 04:50:46

+1

記住全局臨時表可以被其他會話中的其他用戶訪問。你最終可能會有兩個用戶做同樣的事情並相互影響。 – HLGEM 2010-03-30 17:10:58

0

會執行exec(@TEMPSCHEMA)不同的上下文中運行你的程序,因此#TEMP停止執行完成後立即存在?

是啊,here it is

  • 在存儲過程或觸發器,包含一個臨時表的名稱必須是指在同一個存儲過程中創建一個臨時表中的所有語句。臨時表不能在調用或調用存儲過程中創建,也不能在使用EXECUTE或sp_executesql執行的字符串中創建。
1

我輸入查詢的中間結果到一個臨時表的進一步使用

那部分幾乎總是錯誤的。你能分享下一步或兩步計劃做什麼嗎?可能性是,我們可以重寫所有發生在同一個語句中。

1

不支持使用into語句運行必須使用into語句將數據插入臨時表的動態語句。先創建臨時表,然後使用動態查詢插入到臨時表中將工作正常。原因是當使用exec()語句是在子上下文中運行時,一旦上下文關閉,動態臨時表也會丟失。