目标很简单:获取总行数和一些数据页。
当我使用 OFFSET...FETCH 方法实现总行计数的分页时我遇到了以下问题:当我们传递一些大的页码(例如,我们只有 100 行,但请求第 15 行,每页 10 条记录)COUNT(*) OVER() 语句从未调用过,因为结果集是空的。因此,在这种情况下,我们无法获得正确的总行数。
有没有办法使用 OFFSET ... FETCH 方法获得正确的总行数,即使通过了大页码?
仅供引用,OFFSET ... FETCH 方法是:
SELECT
...
Total = COUNT(*) OVER()
FROM Table1
ORDER BY Col1
OFFSET (@PageNum-1) * @PageSize ROWS
FETCH NEXT @PageSize ROWS ONLY;
最佳答案
我认为答案是否定的。您将总行数附加到要返回的每一行。查询未返回任何行,因此没有地方放置总数。
顺便说一下,我确实认为正在计算total
。但如果没有任何行,您将永远看不到它。
编辑:
我能想到的唯一解决方法是在应用程序层。如果没有返回行,则运行:
SELECT Total = COUNT(*) OVER()
FROM Table1;
您实际上可以先运行此程序以获得总数。缺点是当表实际上不是表而是运行成本高昂的 View 时。
https://stackoverflow.com/questions/18184945/