排序分页
继续上一篇的行号分页,接下来讲讲排序分页。
数据库依旧是Northwind,表依旧是Orders,假设每页显示10条记录。
我们先查询第一页的记录。
SELECT TOP 10 * FROM dbo.Orders ORDER BY OrderID ASC
第二页的记录,先升序取出前20条记录,然后在这20条记录里倒序取出前10条记录,最后把这10条记录升序一下。
SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 20 * FROM dbo.Orders ORDER BY OrderID ASC ) T ORDER BY T.OrderID DESC ) T2 ORDER BY T2.OrderID ASC
第三页的记录,先升序取出前30条记录,然后在这30条记录里倒序取出前10条记录,最后把这10条记录升序一下。
SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 30 * FROM dbo.Orders ORDER BY OrderID ASC ) T ORDER BY T.OrderID DESC ) T2 ORDER BY T2.OrderID ASC
由此可以推断出,第N页记录为:
SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP N * 10 * FROM dbo.Orders ORDER BY OrderID ASC ) T ORDER BY T.OrderID DESC ) T2 ORDER BY T2.OrderID ASC
写成通用的SQL语句如下:
BEGIN DECLARE @PageSize INT --每页显示条数 DECLARE @PageIndex INT --页码(从1开始) SET @PageSize = 10 SET @PageIndex = 1 SELECT * FROM ( SELECT TOP ( @PageSize ) * FROM ( SELECT TOP ( @PageIndex * @PageSize ) * FROM dbo.Orders ORDER BY OrderID ASC ) T ORDER BY T.OrderID DESC ) T2 ORDER BY T2.OrderID ASC END
写成存储过程如下:
CREATE PROCEDURE P_GetPagedOrders3 @PageSize INT , -- 每页显示条数 @PageIndex INT , -- 页码(从1开始) @RecordCount INT OUTPUT , -- 数据总数 @PageCount INT OUTPUT -- 总页数 AS BEGIN -- 获取数据总数 SELECT @RecordCount = COUNT(1) FROM dbo.Orders -- 计算总页数 SET @PageCount = ( @RecordCount + @PageSize - 1 ) / @PageSize -- 获取当前页的数据 IF @PageIndex < @PageCount -- 不是最后一页 BEGIN SELECT * FROM ( SELECT TOP ( @PageSize ) * FROM ( SELECT TOP ( @PageIndex * @PageSize ) * FROM dbo.Orders ORDER BY OrderID ASC ) T ORDER BY T.OrderID DESC ) T2 ORDER BY T2.OrderID ASC END ELSE -- 最后一页 BEGIN SELECT * FROM ( SELECT TOP ( @RecordCount % @PageSize ) * FROM dbo.Orders ORDER BY OrderID ASC ) T ORDER BY T.OrderID ASC END END
注意,最后一页需要特殊处理。
测试存储过程:
DECLARE @RecordCount int, @PageCount int EXEC [dbo].[P_GetPagedOrders3] @PageSize = 10, @PageIndex = 2, @RecordCount = @RecordCount OUTPUT, @PageCount = @PageCount OUTPUT SELECT @RecordCount as N'@RecordCount', @PageCount as N'@PageCount'
测试结果如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」