2017-02-17 239 views
3

我不得不建立一個動態的PIVOT在SQL Server作爲使用本文中描述的以下script動態PIVOT查詢 - 如何將它保存在SQL Server中?

DECLARE @DynamicPivotQuery AS NVARCHAR(MAX) 
DECLARE @ColumnName AS NVARCHAR(MAX) 

--Get distinct values of the PIVOT Column 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
     + QUOTENAME(Course) 
FROM (SELECT DISTINCT Course FROM #CourseSales) AS Courses 

--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = 
    N'SELECT Year, ' + @ColumnName + ' 
    FROM #CourseSales 
    PIVOT(SUM(Earning) 
      FOR Course IN (' + @ColumnName + ')) AS PVTTable' 
--Execute the Dynamic Pivot Query 
EXEC sp_executesql @DynamicPivotQuery 

它的偉大工程,並預期返回一個動態表。

不過,我想能夠在其他查詢,選擇它,但無法找到一個合適的方式來做到這一點:

  • 視圖不起作用,因爲它不接受變量
  • 表值函數不工作,我不知道提前輸出表的結構做
  • 存儲過程不起作用,因爲我不能在SELECT查詢中使用它

,會是什麼最好解決方案來保存這個動態數據透視查詢並且能夠在事後選擇它?

謝謝

西爾

+0

您可以創建此函數來構建您的@sql變量並將其返回給您,然後在您的主查詢中,您可以在那裏執行它 – Veljko89

+0

也就是說,如果您的主查詢包含臨時表(或臨時表例)? – Veljko89

回答

0

你可以嘗試使用存儲過程,並在SP利用的SELECT INTO在動態支點查詢和存儲在臨時表(#myDynamicPivot)。

然後,您可以在您的下一個選擇語句中使用臨時表。確保在使用後放下桌子。

編輯

我認爲移動是針對創建到數據倉庫中的數據透視表和在其上創建分析數據庫中的數據。通過這種方式,您可以使用維度進行查詢,並且數據將更快,並且會針對存儲和查詢進行更優化。

+0

謝謝。動態數據透視表依賴於一個定期更新的表,並且它的SELECT查詢將會經常被使用。這將意味着臨時表將被重新創建並經常丟失。在這種情況下,臨時表是否是最佳解決方案,是否會導致性能下降和磁盤活動更高? – sylvain77

+0

這取決於表的大小。如果你有1m行並且經常掉落並創建它,那麼它可能是一個性能問題。臨時表是在臨時數據庫中創建的。這將導致臨時數據庫數據庫的日誌文件變大。也許增加一份工作來定期縮小它。另外,如果你在SQL Server上有足夠的RAM,它將會有所幫助。 –

0

哦。你可以使用臨時表,我的朋友。首先,檢查臨時表的存在。並記住在查詢結束時刪除它。