2013-12-09 80 views
0

美好的一天StackOverflow從動態sql訪問動態表

從我的動態sql創建的表可以具有任意數量的列,因爲它是數據透視表。

-- Pivot the table so we get the UW as columns rather than rows 
DECLARE @SQL NVARCHAR(MAX) 
SET @SQL = ' 
SELECT * 
FROM #PreProcessed 
PIVOT (SUM(Quotes) 
     FOR [UW] IN (' + @UWColumns + ') 
     ) AS bob' 

我運行這段代碼來運行我的動態sql。

EXEC sp_executesql @SQL, 
        N'@UWColumns nvarchar(MAX)', 
        @UWColumns 

我的問題是,我如何存儲結果表?特別是當我不知道它會有多少列時,甚至不知道列將被調用?

我嘗試下面的代碼,但它不工作

INSERT INTO #Temp 
    EXEC sp_executesql @SQL, 
        N'@UWColumns nvarchar(MAX)', 
        @UWColumns 

謝謝大家

+0

您可能需要創建一個真正的表格。在'sp_exectutesql'之外創建的臨時表將在in中有作用域,但其中創建的任何臨時表(臨時表,變量等)將在作用域返回到調用代碼時解除分配。所以,動態SQL創建一個表,以及動態SQL來填充它。或者,重新考慮您的代碼以使用源(標準化)數據。 – MatBailie

回答

0

SQL Server使用SELECT * INTO ....,而不是在CREATE TABLE AS語法。所以你需要修改你的動態SQL:

SELECT * INTO <YOUR TABLE> 
    FROM #PreProcessed 
    PIVOT (SUM(Quotes) 
      FOR [UW] IN (' + @UWColumns + ') 
      ) AS bob' 
+0

嗨,感謝您的幫助,但我收到此錯誤: 消息208,級別16,狀態0,行35 無效的對象名稱'#temp'。 – Bobby

+0

哦,沒有趕上那裏的表變量。我不知道你會怎麼做,因爲你必須聲明變量。你爲什麼試圖將結果保存在臨時表中? – Andrew

+0

我正在撰寫相當複雜的報告,我需要爲我正在製作的數據添加更多信息。不幸的是,這一切將被包裹到一個sp,需要運行時,永遠。我的同事建議使用第二張表並加入我的日期列 – Bobby

0

我能找到解決這個問題的唯一辦法就是做所有我的計算中的動態SQL。這意味着我必須在兩張桌子上工作。

-- Pivot the table so we get the UW as columns rather than rows 
DECLARE @SQL NVARCHAR(MAX) 
SET @SQL = ' 
SELECT * INTO #temp 
FROM #PreProcessed 
PIVOT (SUM(Quotes) 
     FOR [UW] IN (' + @UWColumns + ') 
     ) AS bob 

SELECT DISTINCT t1.Date, d.Declines AS ''Declines'' , '[email protected]+' 
FROM #temp AS t1 LEFT OUTER JOIN 
#Declines AS d ON t1.DATE = d.DATE 
' 

PRINT @SQL 

EXEC(@SQL)