2012-05-09 19 views
1

私はorder by節を動的に設定したいと思います。私は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()の結果でソートすることもできます(各タイプの注文にはまだ1つのROW_NUMBER())。

もう1つは、テンポラリテーブルに最初のクエリ(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 

... 

パフォーマンスの問題は、私は動的にクエリを生成しようとするだろう場合。