我想编写一个执行以下操作的存储过程:
* 返回匹配查询的记录数(以确定向用户显示的页数)
* 返回另一个记录集,其中包含当前页面查询中的某个记录子集。
从我在 StackOverflow 上发现的另一个问题(抱歉,我丢失了链接),我发现我们是这样进行分页的:
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
我可以通过执行以下操作来获取 [obscenely long select query] 返回的记录数:
SELECT COUNT(*) AS numRecords from ([obscenely long select query]) AS records
我想尽可能有效地获取这两个记录集。
我能弄清楚如何做到这一点的唯一方法是将上面的这两个语句推入一个存储过程中。我认为这效率低下,原因如下:
- 我必须写出两次[极其长的选择查询],使解决方案更难以维护/更改(我really如果可能的话,希望避免这种情况)。
- 我必须运行[极其长的选择查询],获取所有可能的记录(可能是数千条),然后将其缩小到分页的合理大小,然后在获取计数时再次运行它。
我尝试过的其他解决方案:
- 将[极其长的选择查询]放入其自己的存储过程中(这会导致语法错误)。
有什么可以做的吗?我应该忍住并坚持使用当前的解决方案,还是有更优雅的方法来实现这一目标?
取决于[obscenely long select query]
您可以使用临时表或表变量的结构:
- 用匹配行的 ID 填充临时表
- 计算临时表行数以计算页数
- 为了检索调用者的结果,使用与相关数据库表连接的临时表构建查询
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)