当前位置: 首页
数据库
SQL Server 2005通用分页存储过程及多表联接应用

SQL Server 2005通用分页存储过程及多表联接应用

热心网友 时间:2026-04-14
转载

SQL Server 2005高效分页存储过程详解与优化

在数据库应用开发中,分页查询是处理海量数据列表与报表展示的核心技术。本文将深入分享一个专为SQL Server 2005设计的通用分页存储过程,该过程巧妙利用ROW_NUMBER()函数实现高效数据分片,在保证优异性能的同时,提供了极高的易用性与灵活性。

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

存储过程核心代码解析

以下是经过优化的分页存储过程完整代码。其核心逻辑是通过动态SQL构建,利用ROW_NUMBER()窗口函数为结果集生成连续行号,从而实现精准的数据切片。

复制代码

存储过程代码如下:

if object_ID('[proc_SelectForPager]') is not null
Drop Procedure [proc_SelectForPager]
Go
Create Proc proc_SelectForPager
(
@Sql varchar(max) ,
@Order varchar(4000) ,
@CurrentPage int ,
@PageSize int,
@TotalCount int output
)
As
/*Andy 2012-2-28 */
Declare @Exec_sql nvarchar(max)
Set @Exec_sql='Set @TotalCount=(Select Count(1) From ('+@Sql+') As a)'
Exec sp_executesql @Exec_sql,N'@TotalCount int output',@TotalCount output
Set @Order=isnull(' Order by '+nullif(@Order,''),' Order By getdate()')
if @CurrentPage=1 /*经常会调用第1页,这里做特殊处理,少一层子查询*/
Set @Exec_sql='
;With CTE_Exec As
(
'+@Sql+'
)
Select Top(@pagesize) *,row_number() Over('+@Order+') As r From CTE_Exec Order By r
'
Else
Set @Exec_sql='
;With CTE_Exec As
(
Select *,row_number() Over('+@Order+') As r From ('+@Sql+') As a
)
Select * From CTE_Exec Where r Between (@CurrentPage-1)*@pagesize+1 And @CurrentPage*@pagesize Order By r
'
Exec sp_executesql @Exec_sql,N'@CurrentPage int,@PageSize int',@CurrentPage,@PageSize
Go

存储过程调用方法与实战示例

该分页存储过程设计灵活,能够完美适配单表查询与复杂多表联接等多种数据库应用场景。

1. 单表数据分页查询

对于单表分页需求,直接传入查询语句即可。以下示例演示如何从contacts表中分页获取特定类型的联系人数据:

复制代码

调用示例代码如下:

Exec proc_SelectForPager @Sql = 'Select * from contacts a where a.ContactType=1', -- varchar(max)
@Order = '', -- varchar(4000)
@CurrentPage = 3, -- int
@PageSize = 20, -- int
@TotalCount = 0 -- int

2. 多表联接分页查询

处理涉及多表关联的复杂分页查询同样简便。您只需构建完整的JOIN语句作为参数传入。以下是一个联接staffOUHIST历史表与Staff员工信息表的实战案例:

复制代码

调用示例代码如下:

Exec proc_SelectForPager @Sql =
'Select a.Staff,a.OU,b.FName+b.FName as Name
from staffOUHIST a
inner join Staff b on b.ID=a.Staff and a.ExpiryDate=''30001231''
', -- varchar(max)
@Order = '', -- varchar(4000)
@CurrentPage = 3, -- int
@PageSize = 20, -- int
@TotalCount = 0 -- int

关键注意事项与优化建议:在传入@Sql参数时,查询语句内部应避免使用公共表表达式(CTE)。这是因为存储过程内部已使用CTE进行分页逻辑封装,外部嵌套可能导致语法冲突或执行错误。理解这一设计约束,有助于您构建正确、高效的传入SQL,确保分页存储过程稳定运行。

来源:https://www.jb51.net/article/33538.htm

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
如何利用SQL进行推理

如何利用SQL进行推理

如何用SQL求解逻辑推理题:经典楼层分配谜题实战 今天我们来探讨一个非常有趣的技术应用:使用SQL来求解逻辑推理题。这听起来或许有些大材小用,但正是这种跨界应用,充分展现了SQL语言的强大灵活性以及开发者分析问题的思维能力。我们将以一个经典的五人楼层分配谜题作为案例,逐步拆解如何用纯粹的SQL找到答

时间:2026-04-14 18:42
SQL2005 provider: 命名管道提供程序 error: 40 无法打开到 SQL Server 的连接

SQL2005 provider: 命名管道提供程序 error: 40 无法打开到 SQL Server 的连接

ASP NET连接SQL Server 2005数据库报错“无法打开连接”的排查与解决 许多开发者在部署ASP NET应用程序并尝试连接SQL Server 2005数据库时,都曾遭遇过这个常见的连接错误提示:“在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下

时间:2026-04-14 18:38
详解删除SQL Server 2005 Compact Edition数据库

详解删除SQL Server 2005 Compact Edition数据库

SQL Server 2005 Compact Edition 数据库删除方法详解 本文将详细介绍如何彻底删除 Microsoft SQL Server 2005 Compact Edition 数据库。由于 SQL Server Compact 数据库本质上是一个独立的物理文件,因此删除过程的核心

时间:2026-04-14 17:45
SQL Server 2008+ Reporting Services (SSRS)使用USER登录问题

SQL Server 2008+ Reporting Services (SSRS)使用USER登录问题

解决SQL Server 2008 R2 Reporting Services非管理员用户访问问题 在部署SQL Server 2008 R2报表服务环境时,一个常见的配置难题是如何为非管理员用户配置访问权限。本次实践基于以下版本: 数据库平台:SQL Server 2008 R2 报表服务:SQL

时间:2026-04-14 17:26
sqlserver多版本查看版本号

sqlserver多版本查看版本号

如何快速判断你的 SQL Server 版本?一份清晰的对照指南 在数据库管理与维护工作中,准确识别 SQL Server 的具体版本是至关重要的第一步。无论是进行故障排查、兼容性评估,还是规划升级路径,明确当前数据库版本信息都是基础。本文旨在提供一套系统、高效的查询方法与版本对照指南,帮助您快速定

时间:2026-04-14 16:52
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜
热门教程
更多
  • 游戏攻略
  • 安卓教程
  • 苹果教程
  • 电脑教程