SQLServerException: 除非另外还指定了 TOP、OFFSET 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。

今天代码升级了一下分页插件版本,结果报错了。
出现这个错误的原因是因为分页插件SQL支持的不够好,或者说就是分页插件的bug,因为低版本中相同SQL不报错,高版本却报错。
先来看sql:

select
*
from
order
order by create desc

我们使用分页插件查询列表,分页插件都会先进行一个count,看数据是否存在,存在则继续查询列表,SQL:

SELECT COUNT(0)
FROM (
select
*
from
order
)
分页插件count的时候会去掉order by,但是出问题的版本没有去掉order by,SQL就是这个版本:
SELECT COUNT(0)
FROM (
select
*
from
order
order by create desc
)

执行SQL,就会报错。

解决方法:
如果单纯在SQL中解决很简单,去掉order by就可以了。
但是我们是在代码中,分页插件如果不想改,那么就改sql,怎么改呢?在SQLServer中,可以用top n,你可能会说筛选的时候我要全量结果怎么办?
使用top 100 percent,SQL如下:

SELECT COUNT(0)
FROM (
select
top 100 percent *
from
order
order by create desc
)

这是一种非常好的解决方法。

还有一种方法就是自己在代码中写count语句,代替分页的count语句。