SQL Server 通用分页存储过程

1、确定存储的输入参数: 
1)SQL脚本,该参数接收完整的、正确的SQL检索文本,可将原应用中写好的SQL脚本直接传入 
2)每页的数据容量,就是一页有多少条数据 
3)当前页码 
2、确定分页机制: 
1)执行传入的SQL脚本,并将结果生成临时表 
2)修改临时表的结构,增加标识列字段 
3)根据标识列字段,计算出指定页码内的记录范围,并返回 
4)返回总数据条数,用于客户端进行分页显示

 

--// ============================ 
--// SQL Server通用分页存储过程 
--// Author : netwild 
--// date : 2010/07/22 
--// Email : netwild@163.com 
--// QQ : 52100641(网无忌) 
--// ============================ 

SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_NULLS ON 
GO 


CREATE PROC execByPage 

@sqlQuery varchar(2000), --//输入参数:SQL检索语句或表名 
@pageSize int, --//输入参数:每页显示记录条数 
@pageIndex int --//输入参数:当前页码 



SET NOCOUNT ON 
SET ANSI_WARNINGS OFF 

declare @tmpTableName varchar(50) 
set @tmpTableName = '##TB1516_' + replace(cast(newid() as varchar(40)),'-','') --//生成随机临时表名称 

declare @subIndex int 
set @subIndex = charindex('from',@sqlQuery) 
if (@subIndex > 0) 
begin --//带FROM的标准检索语句 
declare @sqlQuery1 varchar(2000) 
declare @sqlQuery2 varchar(2000) 
set @sqlQuery1 = substring(@sqlQuery,1,@subIndex - 1) 
set @sqlQuery2 = substring(@sqlQuery,@subIndex,len(@sqlQuery)) 
set @sqlQuery = @sqlQuery1 + ',IDENTITY(numeric,1,1) as ID1516 into ' + @tmpTableName + ' ' + @sqlQuery2 
end 
else --//不带FROM的表名 
begin 
set @sqlQuery = ' *,IDENTITY(numeric,1,1) as ID1516 into ' + @tmpTableName + ' from' + @sqlQuery 
end 
exec(@sqlQuery) --//建立并初始化临时表数据 

declare @indexStart varchar(20),@indexEnd varchar(20) 
set @indexStart = cast((@pageIndex-1)*@pageSize+1 as varchar(20)) --//数据起始行ID 
set @indexEnd = cast(@pageIndex * @pageSize as varchar(20)) --//数据结束行ID 

exec('select * from ' + @tmpTableName + ' where ID1516 between ' + @indexStart + ' and ' + @indexEnd) --//检索该页数据 

exec('select max(ID1516) as recordCount from ' + @tmpTableName) --//提取总条数 

exec('drop table ' + @tmpTableName) --//删除临时表 


GO 
SET QUOTED_IDENTIFIER OFF 
GO 
SET ANSI_NULLS ON 
GO 

 

posted @ 2013-11-06 16:07  Alex.Net  阅读(154)  评论(0编辑  收藏  举报