我正在尝试允许ASC / DESC排序顺序由存储过程中的参数定义。
经过大量研究,我发现了这种方法(简化):
SELECT *
FROM MyTable
ORDER BY CASE WHEN @reverse = 1 THEN
MyColumn
END DESC,
CASE WHEN @reverse = 0 THEN
MyColumn
END ASC
但是,此代码会引发以下错误:
Msg 408,Level 16,State 1,Line 8
在ORDER BY列表中遇到了一个常量表达式,位置为2。
为什么会这样?显然,MyColumn不是常量 - 它是列名。
在兼容模式2016(130)中使用SQL Server 2016
由于
答案 0 :(得分:1)
在some search this line helped me了解更多信息之后......
按表达式排序必须求值为常量
正如Lamak指出的那样,1=0
的计算结果为false,而你没有定义一个else条件。所以null是未定义的,它会抛出错误
摆脱下面的尝试
ORDER BY CASE WHEN 1 = 1 THEN
MyColumn
END DESC,
CASE WHEN 1 = 0 THEN
col2 else col2--not your column,added this to make example clearer
END ASC
还要注意,按顺序排列的表达式必须是唯一的,因此你的查询将无效(即使它成功)并抛出不同的错误,你也可以使用ISNULL
答案 1 :(得分:0)
所有这些悲伤的真正根本原因是:
ASC
需要
SELECT, FROM
是一个硬编码字符串(如{{1}}等),不能是字符串变量。 ; - ((
为了克服这个限制, 和试图使用CASE克服它的问题, 我已经将95%的查询填充为表变量, 然后我有两个查询之一,使用正确的ORDER BY子句从中选择SELECT。