目前我们使用分页过滤器执行两个查询来获取计数和结果。虽然我们可以轻松地将这两者组合成一个网络调用(使用 sql 分隔符),但有没有办法在遵循DRY原则的单个查询中做到这一点?
-- count
SELECT COUNT(*) FROM table;
-- result with pagination
SELECT *
FROM (SELECT ROW_NUMBER() OVER (ORDER BY tbl.idn) AS row, * FROM tbl)_tbl
WHERE row >= 1 AND row <= 10;
维护两个查询确实具有挑战性 - 单个查询减少了维护开销。
您可以尝试创建一个存储过程并从应用程序中调用它。
或者您可以使用子查询:
编辑。
更好的是,您可以使用
OFFSET FETCH
子句进行分页 puprose。您将获得更简洁的代码和更高的性能(这里没有窗口函数)。例如像这样的东西:或使用子查询:
子查询和变量方法之间没有显着差异。更多的是关于符号。SQL Server 执行几乎相同的工作(附加的“nocost”嵌套循环)。在这种特殊情况下,我更喜欢避免使用窗口功能(可能的表假脱机 - 对 tempdb 的额外影响)。