适用于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字符串,避免执行时出现错误。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述