分页存储过程

/*思路:

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 --//输入参数:当前页码      
AS   
   
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 = 'select *,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 @ 2010-12-08 10:39  瑞君  Views(346)  Comments(0Edit  收藏  举报