2014-10-27 52 views
0

我在寫存儲過程。我有一個字符串,其中包含一個SQL查詢。例如:SQL服務器 - 從執行的查詢字符串在臨時表中動態填充結果

DECLARE @sql nvarchar(max) 
SET @sql = (N'SELECT pkOrderID FROM Orders') 

(只是要注意:這不是select語句看起來這只是我的意思爲例)然後,我想執行的字符串,並把結果在一個臨時表例如#tempTable。我知道EXEC(@sql)存在,但不知道在這種情況下它是否會對我有好處。另一個問題是,我不知道返回的@sql中所有列的名稱,所以臨時表#tempTable需要基於@sql的返回而創建。謝謝你的幫助。

回答

1

有沒有簡單的方法來做到這一點。 @ JanR解決方案的問題在於#tmporders表超出了調用存儲過程的腳本的範圍(即它會產生一個錯誤,如「無效的對象名'#rtmporders'」

一種替代方法是。使用全局臨時表(如## tmporders)

所以你的SP可能是這樣的:

CREATE PROCEDURE TestSP 
AS 
BEGIN 
    SELECT pkOrderID INTO ##tmporders FROM Orders 
END 
GO 

並調用腳本可能是這樣的:

EXEC TestSP 
SELECT * FROM ##temporders 
+0

雅我剛碰到超出範圍問題。讓我試一試 – frontin 2014-10-27 00:58:03

+0

當我嘗試使用DROP TABLE ## tempTable在sp的末尾刪除表時。它說不能下降,因爲它不存在或我沒有權限。我猜它認爲它不存在,但它的確如此,因爲它正確地執行了字符串語句...... – frontin 2014-10-27 01:26:04

+0

創建表的會話結束時,全局臨時表(## table)會自動刪除,並且每當任何其他TSQL引用該表已完成。 – JohnS 2014-10-27 01:58:09

1

我認爲你可以使用SELECT INTO做你想要什麼,但它意味着更新您的字符串:

DECLARE @sql nvarchar(max) 
SET @sql = (N'SELECT frompkOrderID INTO #tmporders FROM Orders') 

,那麼你應該能夠運行EXEC @sql創建表

更多信息關於SELECT INTO這裏:http://msdn.microsoft.com/en-au/library/ms188029.aspx

+0

是否有辦法我做這件事s沒有創建tempTable的結構並動態地讓它創建基於從@sql返回的whats的列 – frontin 2014-10-27 00:21:22

+0

Select Into將根據結果創建表(假定它尚不存在)。將添加一個參考我的回答 – JanR 2014-10-27 00:25:44

+0

感謝您的幫助人。 :) – frontin 2014-10-27 00:36:00