小编典典

SQL Server 2008 R2中的有效分页

sql

我想编写一个执行以下操作的存储过程:返回与查询匹配的记录数(以确定要显示给用户的页面数)从当前页面的查询返回具有特定记录子集的另一个记录集。

从我发现的另一个问题(对不起,我丢失了链接),我发现我们这样做是分页的:

SELECT u.* FROM 
(
    SELECT t.*, ROW_NUMBER() OVER (ORDER BY t.id) as rownum FROM
    (
        [obscenely long select query]
    )
    as t
)
AS u WHERE u.rowNum >= 1 AND u.rowNum <= 20

通过执行以下操作,我可以获得[冗长的选择查询]返回的记录数:

SELECT COUNT(*) AS numRecords from ([obscenely long select query]) AS records

我想尽可能有效地获得这两个记录集。

我能弄清楚该怎么做的唯一方法是将以上两个语句都放入一个存储过程中。由于某些原因,这使我感到效率低下:

  • 我必须写出两次[过长的选择查询],这使得解决方案难以维护/更改(如果可能的话,我 真的 想避免这种情况)。
  • 我必须运行[淫秽的长选择查询],获取所有可能的记录(可能是几千条),然后再将其缩减为合理的分页大小,而仅在获得计数时再次运行它。

我尝试过的其他解决方案:

  • 将[冗长的选择查询]放入其自己的存储过程中(这会导致语法错误)。

有什么可以做的吗?我应该只是吸收它并坚持使用当前的解决方案,还是有一种更优雅的方法来实现这一目标?


阅读 344

收藏
2021-03-08

共1个答案

小编典典

根据[obscenely long select query]结构的不同,您可能可以使用临时表或表变量:
-用匹配行的ID填充临时表
-计算临时表的行数以计算页数
-检索调用方构建的结果带有临时表和相关数据库表的查询

2021-03-08