SQL Server 分页查询:传统与高效写法解析
SQL Server 分页查询常见有两种实现方式:一是使用 TOP N 与 NOT IN 的传统子查询方法,二是基于 SQL Server 2005 及以上版本的 ROW_NUMBER() 窗口函数。本文将分别展示这两种方法的存储过程编写技巧及核心逻辑。
方法一:基于 TOP N 的传统分页
这种写法是早期 SQL Server 版本中常用的分页手段。其核心逻辑是:先排除掉前面所有页面的记录(使用 NOT IN),再从剩余记录中选取当前页所需数量的数据(使用 TOP)。
第1步:创建分页存储过程
目的:封装分页逻辑,通过参数控制每页大小和页码。
入口:SQL Server Management Studio (SSMS) 或任何支持 T-SQL 的执行环境。
动作:定义存储过程 p_paged1,接受两个整数参数:@pageSize(每页记录数)和 @currentPage(当前页码)。
重要参数:
@pageSize int: 每页显示的数据条数。@currentPage int: 用户请求的页码,从 1 开始。
create proc p_paged1
@pageSize int,
@currentPage int
as
select top (@pageSize) * from student
where id not in
(select top (@pageSize*(@currentPage-1)) id from student)
go
exec p_paged1 2,3
完成状态判断:执行存储过程后,若能返回指定页码对应的学生记录列表,则说明分页逻辑配置正确。注意,此方法在数据量极大时,NOT IN 子句可能导致性能下降。
方法二:基于 ROW_NUMBER() 的高效分页
自 SQL Server 2005 起,微软引入了窗口函数 ROW_NUMBER(),使得分页操作更加直观和高效。该方法为结果集中的每一行分配一个唯一的序号,然后通过范围过滤获取目标页数据。
第2步:创建基于 ROW_NUMBER 的分页存储过程
目的:利用序列号进行精确的范围截取,提升复杂排序下的分页效率。
入口:SSMS 或其他 T-SQL 执行工具。
动作:创建存储过程 p_paged2,计算起始行号和结束行号。
重要参数:
@pageStart int: 起始行号(通常为(@currentPage - 1) * @pageSize + 1)。@pageEnd int: 结束行号(通常为@currentPage * @pageSize)。
create proc p_paged2
@pageStart int,
@pageEnd int
as
select * from
(select *, row_number() over(order by id desc) as rnum
from student) t
where t.rnum between @pageStart and @pageEnd
go
exec p_paged2 5,10
完成状态判断:执行 exec p_paged2 5,10 应返回按 id 降序排列的第 5 到第 10 条学生记录。若结果集行数符合预期且顺序正确,则说明实现无误。
简要总结
传统 TOP ... NOT IN 方法逻辑简单但扩展性差;而 ROW_NUMBER() 方法配合 BETWEEN 过滤是现代 SQL Server 开发中的推荐做法,尤其在处理多字段排序和大数据量时表现更佳。建议在新项目中优先采用第二种写法。
以上就是 SQL Server 分页查询两种写法的详细内容,更多关于数据库优化与存储过程编写的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









