Sql server 如何在SQLServer中动态设置订单?

Sql server 如何在SQLServer中动态设置订单?,sql-server,dynamic,sql-order-by,Sql Server,Dynamic,Sql Order By,我想动态地设置ORDERBY子句。我已经用case试过了 但在几起案件之后,它对我不起作用,我也不明白为什么会发生这种情况。我已经尝试了以下链接,这只适用于5-6个案例,之后我得到了转换错误 ORDER BY CASE WHEN @OrderBY = 1 THEN Pla_BattingAverage WHEN @OrderBY = 2 THEN Pla_HomeRuns WHEN @OrderBY = 3 THEN Pla_RBIs

我想动态地设置ORDERBY子句。我已经用
case
试过了

但在几起案件之后,它对我不起作用,我也不明白为什么会发生这种情况。我已经尝试了以下链接,这只适用于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

例如,不能在case表达式的结果中混合字符串和整数

您可以尝试以下方式:

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 

请注意,这将很慢,因为无法使用索引。动态生成查询可以提供更好的性能。

例如,不能在大小写表达式的结果中混合使用字符串和整数

您可以尝试以下方式:

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 
请注意,这将很慢,因为无法使用索引。动态生成查询可以提供更好的性能。

的建议之一是

您还可以使用
ROW\u NUMBER()
并按
ROW\u NUMBER()
函数的结果排序(对于每种类型的订单,仍然有一个
ROW\u 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

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

的建议之一是

您还可以使用
ROW\u NUMBER()
并按
ROW\u NUMBER()
函数的结果排序(对于每种类型的订单,仍然有一个
ROW\u 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

...

但是,如果性能有问题,我会尝试动态生成查询。

您是否可以发布准确的错误消息和产生此错误的查询?需要设置@OrderBY的代码,即完整查询。您是否可以发布准确的错误消息和产生此错误的查询?需要设置@OrderBY的代码,即完整查询。