2012-05-09 31 views
1

我想動態地設置按順序的順序。我已經通過使用case進行了嘗試。如何在SQL Server中動態設置順序?

但是在很少的情況下,它不適合我,我不明白爲什麼會發生這種情況。我已經嘗試了以下鏈接http://www.sqlteam.com/article/dynamic-order-by這個工作僅適用於5-6個案例,之後我收到了轉換錯誤。

ORDER BY CASE WHEN @OrderBY = 1 THEN Pla_BattingAverage 
      WHEN @OrderBY = 2 THEN Pla_HomeRuns 
      WHEN @OrderBY = 3 THEN Pla_RBIs 
      WHEN @OrderBY = 4 THEN Pla_StolenBases 
      END DESC 
+0

您能否請發佈確切的錯誤消息和提供此錯誤的查詢? –

+0

需要設置@OrderBY的代碼,即完整查詢。 – Paul

回答

1

你不能在案例表達式的結果中混合字符串和整數。

你可以嘗試這樣的事情,而不是:

ORDER BY CASE WHEN @OrderBY = 1 THEN Pla_BattingAverage END DESC, 
     CASE WHEN @OrderBY = 2 THEN Pla_HomeRuns END DESC, 
     CASE WHEN @OrderBY = 3 THEN Pla_RBIs END DESC, 
     CASE WHEN @OrderBY = 4 THEN Pla_StolenBases END DESC 

注意,這將是緩慢,因爲索引不能使用。動態生成查詢可以獲得更好的性能。

0

solution之一被Mark Byers建議。

您也可以使用ROW_NUMBER()並根據ROW_NUMBER()函數的結果進行排序(每種訂單仍有一個ROW_NUMBER())。

另一個是在臨時表中保存第一個查詢的結果(我假設沒有TOP子句),然後用IF返回結果。

喜歡的東西:

INSERT INTO #results 
SELECT 
    a, b, c 
FROM 
    table 
... 

IF @OrderBY = 1 THEN 
    SELECT * FROM #results ORDER BY Pla_BattingAverage DESC 
END 

IF @OrderBY = 2 THEN 
    SELECT * FROM #results ORDER BY Pla_HomeRuns DESC 
END 

... 

但是,如果表現的事項我會嘗試動態生成的查詢。

相關問題