首页 > 数据库 >SQL Server 2005通用分页存储过程及多表联接应用

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

来源:互联网 2026-04-08 16:11:10

适用于SQL Server 2005的高效分页存储过程分享 在数据库应用开发中,分页处理是一项常见且关键的需求,特别是在处理大数据量的报表或列表展示时。本文将分享一个通用的分页存储过程,它是为SQL Server 2005环境专门设计的,在确保高性能的同时,也兼顾了使用的便捷性。 存储过程核心代码解

适用于SQL Server 2005的高效分页存储过程分享

在数据库应用开发中,分页处理是一项常见且关键的需求,特别是在处理大数据量的报表或列表展示时。本文将分享一个通用的分页存储过程,它是为SQL Server 2005环境专门设计的,在确保高性能的同时,也兼顾了使用的便捷性。

存储过程核心代码解析

该存储过程的核心思路是利用SQL Server 2005引入的ROW_NUMBER()函数进行数据分片,并通过动态构建SQL语句来实现灵活的分页查询。

复制代码

完整的存储过程创建代码如下:

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

分页存储过程的调用方法

该存储过程设计灵活,能够方便地处理单表查询或多表联接查询的分页需求。

单表分页查询示例

对于单表分页,只需将查询语句作为参数传入。例如,从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

多表联接分页查询示例

处理多表联合查询时,方法与单表类似,只需构建好完整的联接SQL语句。以下是一个联接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)。这是由该存储过程内部的处理逻辑所决定的。了解这一限制有助于正确构建传入的SQL字符串,避免执行时出现错误。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

相关攻略

更多

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。