如何在SQL Server中动态设置顺序?

时间:2012-05-09 07:56:27

标签: sql-server dynamic sql-order-by

我想动态设置order by子句。我使用case尝试过。

但是在少数情况下它不适合我,我不知道为什么会发生这种情况。我尝试了以下链接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

2 个答案:

答案 0 :(得分: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 

请注意,由于无法使用索引,因此速度很慢。动态生成查询可以提供更好的性能。

答案 1 :(得分: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

...

但是如果性能很重要,我会尝试动态生成查询。