存储过程 - 在 ORDER BY 列表位置 2 中遇到常量表达式
Posted
技术标签:
【中文标题】存储过程 - 在 ORDER BY 列表位置 2 中遇到常量表达式【英文标题】:Stored procedure - A constant expression was encountered in the ORDER BY list, position 2 【发布时间】:2015-09-17 13:09:12 【问题描述】:我在下面用 MSSQL 写了一个存储过程。它在 ORDER BY 子句中抛出错误。
a) 如果我在 ORDER BY 子句中只放置一个条件,它就可以正常工作。
b) 我不确定为什么它在执行过程时同时执行 ORDER BY 子句中的 CASE 语句的两个条件。理想情况下,如果满足第一个条件,它应该跳过第二个。
错误信息是:
错误:消息 408,级别 16,状态 1,行 3 在 ORDER BY 列表的位置 2 中遇到了一个常量表达式。
这是查询:
SELECT *
FROM tb_officemaster
WHERE 1 = 1
AND officecity LIKE '%gurgaon%'
AND minprice > 100
AND maxprice < 1000
ORDER BY
CASE WHEN 'priceasc'='priceasc' THEN "minprice" END ASC,
CASE WHEN 'pricedesc'='priceasc' THEN minprice END DESC
【问题讨论】:
【参考方案1】:在ORDER BY
子句中查看CASE
表达式,如下所示。这里的条件'priceasc'='priceasc'
是一个常量表达式,无论如何总是正确的,实际上并没有任何意义。它不会评估任何东西。 ORDER BY
必须以某种方式将给定的表达式评估为行的值并相应地排序。在您的情况下,THEN "minprice"
也是一个常数。
ORDER BY CASE WHEN 'priceasc'='priceasc' THEN "minprice" END ASC
根据您发布的查询,order by
子句没有意义,您可以省略它。您的查询可以简单地是
select *
from tb_officemaster
where 1=1
and officecity like'%gurgaon%'
and minprice >100
and maxprice < 1000
根据您的评论,将您的 ORDER BY
更改为如下所示
ORDER BY CASE WHEN pricedesc = priceasc THEN minprice END DESC
【讨论】:
感谢 Rahul,在上面的行中,我通过存储过程传递的参数不是恒定的。 ORDER BY CASE WHEN 'priceasc'='priceasc' THEN "minprice" END ASC ..这里 priceasc 是参数,表示第一个条件为真。这里发生的事情是我的第二个条件是也被处决了.. @KapilS,然后删除单引号。我相信这就是错误的根源。 我从下午开始就一直在努力解决这个问题,不管有没有引号都可以正常工作。问题是这部分代码有一些未知的问题集 @dynamicsql=@dynamicsql +' ORDER BY CASE WHEN '' priceasc''=' set @dynamicsql=@dynamicsql +''''+@orderbydetail +''' THEN "minprice" END (select null) ASC ,' set @dynamicsql=@dynamicsql +' CASE WHEN ''priceesc'' ='''+@orderbydetail+''' THEN minprice END (select null) DESC ' 再次为了满意,我删除了双引号和同样的问题。如果按子句集@dynamicsql=@dynamicsql +' ORDER BY 的顺序删除不匹配的条件,此代码将正常工作CASE WHEN ''priceasc''=' set @dynamicsql=@dynamicsql +''''+@orderbydetail +''' THEN minprice END ASC ,' set @dynamicsql=@dynamicsql +' CASE WHEN ''priceesc''=' ''+@orderbydetail+''' THEN minprice END DESC '以上是关于存储过程 - 在 ORDER BY 列表位置 2 中遇到常量表达式的主要内容,如果未能解决你的问题,请参考以下文章
如果语句包含 UNION、INTERSECT 或 EXCEPT 运算符,则 ORDER BY 项必须出现在选择列表中
SQL 分页查询存储过程中order by 后面不能传变量的问题怎么解决
MySQL 存储过程 SELECT、三个 WHERE CLAUSE 值和 ORDER BY