SQL Server 2005 实现万能分页存储过程(主表+子表)

青禾
青禾
发布时间:2026-10-14| 6人浏览过
原创

本文介绍在 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 分页技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。