SQL Server 2005 实现万能分页存储过程(主表+子表)
本文介绍在 SQL Server 2005 环境中,如何通过 T-SQL 编写包含主表分页与子表详情关联的存储过程逻辑。核心思路是利用 ROW_NUMBER() 函数对主表数据进行序号化并筛选指定页码范围,随后借助游标遍历分页后的主表记录,逐条获取对应的子表数据并存入临时表,最终整合结果集。
准备条件与环境
该方案基于 SQL Server 2005 版本的数据库特性设计,主要依赖以下核心机制:
- ROW_NUMBER() 窗口函数:用于为查询结果添加连续行号,是实现高效分页的基础。
- 临时表 (#temp):会话级临时对象,用于暂存分页后的主表数据和关联的子表数据。
- T-SQL Cursor (游标):在此场景下用于处理“一对多”或复杂关联的分页后详情查询,虽然性能不如集合操作,但在早期版本处理特定逻辑时具有灵活性。
核心操作步骤
第1步:定义临时表结构
首先创建两个临时表,分别用于存储主表的分页结果和子表的详情数据。这有助于理清数据结构,避免直接在大规模数据上操作。
-- 建立主表临时表
CREATE TABLE #temp(
rownumber bigint,
orderseqno VARCHAR(36),
goodsname VARCHAR(50),
companyname VARCHAR(100)
)
-- 建立子表临时表
CREATE TABLE #detail(
orderseqno VARCHAR(36),
detailid UNIQUEIDENTIFIER,
unitprice DECIMAL(12,2),
Qty int
)
第2步:主表数据分页截取
利用 ROW_NUMBER() 函数按照创建时间倒序排列订单信息,并通过外层 WHERE 子句筛选出第 10 到 20 行的数据(模拟第二页数据)。将截取得到的主表关键字段插入到 #temp 临时表中。
INSERT INTO #temp
SELECT oo.rownumber, oo.OrderSeqNO, oo.GoodsName, oo.CompanyName FROM
(SELECT ROW_NUMBER() OVER (ORDER BY oi.createdate DESC) AS rownumber,
oi.OrderSeqNO, oi.GoodsName ,ci.CompanyName
FROM OrderInfo oi INNER JOIN CompanyInfo ci ON oi.CompanyID=ci.CompanyID
WHERE oi.CreateDate < GETDATE()
) AS oo
WHERE rownumber BETWEEN 10 AND 20
第3步:配置游标并打开循环
为了从子表获取与当前页主表记录对应的详细信息,需要遍历 #temp 中的每条记录。这里定义一个游标 @temp_cursor,指向 #temp 中的 orderseqno 和 goodsname。
-- 定义游标
DECLARE @temp_cursor CURSOR
-- 给游标赋值
SET @temp_cursor = CURSOR FOR SELECT #temp.orderseqno, #temp.goodsname FROM #temp
-- 定义游标循环过程中所需保存的临时数据变量
DECLARE @orderseqno VARCHAR(36), @goodsname varchar(50)
-- 打开游标
OPEN @temp_cursor
-- 获取第一条数据
FETCH NEXT FROM @temp_cursor INTO @orderseqno, @goodsname
第4步:游标循环插入子表数据
在 WHILE @@FETCH_STATUS = 0 循环中,根据当前游标取出的 @orderseqno 去 OrderDetail 表中查找对应的明细数据,并将其插入到 #detail 临时表中。每次处理完一条后,移动游标指针。
-- 循环游标,查询子表数据,然后插入子表临时表
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO #detail
SELECT od.OrderSeqNO, od.OrderDetailID, od.UnitPrice, od.Qty
FROM OrderDetail od
WHERE od.OrderSeqNO = @orderseqno
FETCH NEXT FROM @temp_cursor INTO @orderseqno, @goodsname
END
第5步:关闭游标并清理资源
数据收集完毕后,必须按顺序关闭和解分配游标,以防止内存泄漏。随后可以查看拼接好的完整结果,并最终删除临时表释放空间。
-- 关闭游标
CLOSE @temp_cursor
DEALLOCATE @temp_cursor
-- 查看结果
SELECT * FROM #temp
SELECT * FROM #detail
-- 删除临时表
DROP TABLE #temp
DROP TABLE #detail
完成判断与维护注意
执行成功标志:脚本运行无误,#temp 和 #detail 中被正确填充了符合分页范围和关联条件的数据,且没有报错。
注意事项:
此段 T-SQL 代码仅在 SQL Server 2005 环境下调试成功。在实际生产环境中,游标的使用往往带来较大的性能开销,若数据量巨大,建议优先优化关联查询或使用更先进的分页技术(如 SQL Server 2012+ 的 OFFSET/FETCH),仅在特定兼容需求下使用此方案。
以上就是 SQL Server 2005 万能分页存储过程的详细内容,更多关于 SQL Server 分页技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













