SQL Server 2005通用分页存储过程及多表联接应用
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,确保分页存储过程稳定运行。
热门专题
热门推荐
说起AI作画,现在可真不是新鲜事了,但如何让工具既强大又好上手,一直是个挑战。而阿里云推出的通义万相,恰好在这两者之间找到了不错的平衡。它拥有的文生图和图生图能力,实实在在地降低了图片创作的门槛,让非专业人士也能玩转设计。未来,这套能力在艺术设计、游戏研发和文化创意等领域,潜力不可小觑。简单来说,它
《王者荣耀世界》铜碎薇高效采集全攻略 在《王者荣耀世界》的开放世界中,铜碎薇作为一种醒目的橙色品质草药,是玩家进行药品合成与角色培养不可或缺的基础资源。掌握其高效采集方法,对于开荒期快速积累资源、提升游戏体验至关重要。本文将为你详细解析铜碎薇的分布规律与最优采集路线,助你事半功倍。 经过实测,铜碎薇
Stariu:当灵感遇见AI,一个绘画助手的双向思维 在数字艺术创作领域,工具的价值不仅在于执行命令,更在于激发灵感。Stariu正是这样一位特别的“助手”——它基于人工智能技术,核心能力在于巧妙地打通图像与文字之间的隔阂,让创意在两种形态间自由流转。 具体来看,它的功能可以归结为三个相辅相成的方向
崩坏星穹铁道三周年庆典:幻月新游戏活动玩法与周年福利全解析 《崩坏星穹铁道》三周年庆典现已盛大开启,其中备受瞩目的「幻月新游戏」主题活动无疑是本次庆典的核心亮点。本次活动将采用分阶段、阵营对抗的玩法,玩家需选择支持的阵营,并通过完成各类日常与挑战任务为己方积累“愿力”。所有努力都将在最终的奖杯直播对
TensorFlow:从多维张量到智能应用的流动之旅 提起深度学习框架,TensorFlow是一个绕不开的名字。这个由谷歌团队打造的开源软件库,自2015年首次亮相以来,便迅速成为高性能数值计算,尤其是机器学习研究和生产应用的核心工具之一。它的强大之处在于,能够无缝支持从CPU、GPU到专用TPU在





