2009-11-23 65 views
1

有沒有辦法編寫SQL Server存儲過程,它是強類型的(即返回已知的列結果集)並使其語句組成爲動態的。SQL Server 2005/2008組使用參數的語句不使用動態SQL?

喜歡的東西:

SELECT SUM(Column0) FROM Table1 
GROUP BY @MyVar 

我試過下面還有:

SELECT SUM(Column0) FROM Table1 
GROUP BY CASE @MyVar WHEN 'Column1' THEN Column1 ELSE Column2 

第二條語句只能在場景中的DB類型的列1和列2是相同的。如果它們不是,則SQL引擎會拋出類似於以下內容的錯誤:「將nvarchar值'SYSTEM'轉換爲數據類型[The TYPE TYPE]時轉換失敗。」

我可以做些什麼來實現強大的結果集,但還有一些動態的部分 - 即我的案例中的石斑魚?這將暴露給LINQ。

編輯:

看起來你可以做到,但你不應該!絕對是過度殺傷。測試顯示數千倍的執行計劃。只有在更大的結果集時它纔會變慢。

回答

4

您可以在中恆集團,這可能是有用的

SELECT 
    SUM(Column0), 
    CASE @MyVar WHEN 'Column1' THEN Column1 ELSE '' END AS MyGrouping 
FROM 
    Table1 
GROUP BY 
    CASE @MyVar WHEN 'Column1' THEN Column1 ELSE '' END 

編輯:對於數據類型不匹配和多個值,這使您可以在兩列組...

SELECT 
    SUM(Column0), 
    CASE @MyVar WHEN 'Column1' THEN Column1 ELSE NULL END AS Column1, 
    CASE @MyVar WHEN 'Column2' THEN Column2 ELSE NULL END AS Column2 
FROM 
    Table1 
GROUP BY 
    CASE @MyVar WHEN 'Column1' THEN Column1 ELSE NULL END, 
    CASE @MyVar WHEN 'Column2' THEN Column2 ELSE NULL END 
+0

+1整齊!我即將說這是不可能的......你每天都在繼續學習新的東西! – 2009-11-23 16:44:38

+0

@Ivan:好的,我應該分組NULL.Please看我的更新。 – gbn 2009-11-23 18:18:09

+0

我明白了。謝謝。 – 2009-11-23 18:22:23

2

你是即將在腳下自殺,並要求更大的子彈。

唯一明智的方法,這是對IF分離成T-SQL流程控制語句:

IF (0 = @MyVar) 
SELECT SUM(Column0) FROM Table1 GROUP BY Column1; 
ELSE IF (1 = @MyVar) 
    SELECT SUM(Column0) FROM Table1 GROUP BY Column2; 
ESLE IF (2 = @myVar) 
    SELECT SUM(Column0) FROM Table1 GROUP BY Column3; 

您查詢優化想要的最後一件事是產生具有GROUP BY計劃一個由變量決定的條件。

+0

別管我以前的評論。經過一些測試,我完全同意你的看法。你可以做到,但你不應該這樣做。雖然你是正確的,但這不是實際問題的答案。我贊成你順便說一句。 – 2009-11-23 18:18:13