Sql server 如何在SQLServer中动态设置订单?
我想动态地设置ORDERBY子句。我已经用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
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的代码,即完整查询。