存储过程 分页处理


None.gif
CREATE   PROCEDURE  dbo.proc_ListPageInt
None.gif(
None.gif
@tblName       nvarchar ( 200 ),         -- --要显示的表或多个表的连接
None.gif
@fldName       nvarchar ( 500 =   ' * ' ,     -- --要显示的字段列表
None.gif
@pageSize      int   =   10 ,         -- --每页显示的记录个数
None.gif
@page          int   =   1 ,         -- --要显示那一页的记录
None.gif
@pageCount      int   =   1  output,             -- --查询结果分页后的总页数
None.gif
@Counts      int   =   1  output,                 -- --查询到的记录数
None.gif
@fldSort      nvarchar ( 200 =   null ,     -- --排序字段列表或条件
None.gif
@Sort          bit   =   0 ,         -- --排序方法,0为升序,1为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ')
None.gif
@strCondition      nvarchar ( 1000 =   null ,     -- --查询条件,不需where
None.gif
@ID          nvarchar ( 150 ),         -- --主表的主键
None.gif
@Dist                   bit   =   0             -- --是否添加查询字段的 DISTINCT 默认0不添加/1添加
None.gif
)
None.gif
AS
None.gif
SET  NOCOUNT  ON
None.gif
Declare   @sqlTmp   nvarchar ( 1000 )         -- --存放动态生成的SQL语句
None.gif
Declare   @strTmp   nvarchar ( 1000 )         -- --存放取得查询结果总数的查询语句
None.gif
Declare   @strID       nvarchar ( 1000 )         -- --存放取得查询开头或结尾ID的查询语句
None.gif

None.gif
Declare   @strSortType   nvarchar ( 10 )     -- --数据排序规则A
None.gif
Declare   @strFSortType   nvarchar ( 10 )     -- --数据排序规则B
None.gif

None.gif
Declare   @SqlSelect   nvarchar ( 50 )          -- --对含有DISTINCT的查询进行SQL构造
None.gif
Declare   @SqlCounts   nvarchar ( 50 )           -- --对含有DISTINCT的总数查询进行SQL构造
None.gif

None.gif
None.gif
if   @Dist    =   0
None.gif
begin
None.gif    
set   @SqlSelect   =   ' select  '
None.gif    
set   @SqlCounts   =   ' Count(*) '
None.gif
end
None.gif
else
None.gif
begin
None.gif    
set   @SqlSelect   =   ' select distinct  '
None.gif    
set   @SqlCounts   =   ' Count(DISTINCT  ' + @ID + ' ) '
None.gif
end
None.gif
None.gif
None.gif
if   @Sort = 0
None.gif
begin
None.gif    
set   @strFSortType = '  ASC  '
None.gif    
set   @strSortType = '  DESC  '
None.gif
end
None.gif
else
None.gif
begin
None.gif    
set   @strFSortType = '  DESC  '
None.gif    
set   @strSortType = '  ASC  '
None.gif
end
None.gif
None.gif
None.gif
None.gif
-- ------生成查询语句--------
None.gif--
此处@strTmp为取得查询结果数量的语句
None.gif
if   @strCondition   is   null   or   @strCondition = ''       -- 没有设置显示条件
None.gif
begin
None.gif    
set   @sqlTmp   =    @fldName   +   '  From  '   +   @tblName
None.gif    
set   @strTmp   =   @SqlSelect + '  @Counts= ' + @SqlCounts + '  FROM  ' + @tblName
None.gif    
set   @strID   =   '  From  '   +   @tblName
None.gif
end
None.gif
else
None.gif
begin
None.gif    
set   @sqlTmp   =   +   @fldName   +   ' From  '   +   @tblName   +   '  where (1>0)  '   +   @strCondition
None.gif    
set   @strTmp   =   @SqlSelect + '  @Counts= ' + @SqlCounts + '  FROM  ' + @tblName   +   '  where (1>0)  '   +   @strCondition
None.gif    
set   @strID   =   '  From  '   +   @tblName   +   '  where (1>0)  '   +   @strCondition
None.gif
end
None.gif
None.gif
-- --取得查询结果总数量-----
None.gif
exec  sp_executesql  @strTmp ,N ' @Counts int out  ' , @Counts  out
None.gif
declare   @tmpCounts   int
None.gif
if   @Counts   =   0
None.gif    
set   @tmpCounts   =   1
None.gif
else
None.gif    
set   @tmpCounts   =   @Counts
None.gif
None.gif    
-- 取得分页总数
None.gif
     set   @pageCount = ( @tmpCounts + @pageSize - 1 ) / @pageSize
None.gif
ExpandedBlockStart.gifContractedBlock.gif    
/**/ /**当前页大于总页数 取最后一页**/
None.gif    
if   @page > @pageCount
None.gif        
set   @page = @pageCount
None.gif
None.gif    
-- /*-----数据分页2分处理-------*/
None.gif
     declare   @pageIndex   int   -- 总数/页大小
None.gif
     declare   @lastcount   int   -- 总数%页大小 
None.gif

None.gif    
set   @pageIndex   =   @tmpCounts / @pageSize
None.gif    
set   @lastcount   =   @tmpCounts % @pageSize
None.gif    
if   @lastcount   >   0
None.gif        
set   @pageIndex   =   @pageIndex   +   1
None.gif    
else
None.gif        
set   @lastcount   =   @pagesize
None.gif
None.gif    
-- //***显示分页
None.gif
     if   @strCondition   is   null   or   @strCondition = ''       -- 没有设置显示条件
None.gif
     begin
None.gif        
if   @pageIndex < 2   or   @page <= @pageIndex   /   2   +   @pageIndex   %   2     -- 前半部分数据处理
None.gif
             begin  
None.gif                
if   @page = 1
None.gif                    
set   @strTmp = @SqlSelect + '  top  ' +   CAST ( @pageSize   as   VARCHAR ( 4 )) + '   ' +   @fldName + '  from  ' + @tblName                         
None.gif                        
+ '  order by  ' +   @fldSort   + '   ' +   @strFSortType
None.gif                
else
None.gif                
begin                     
None.gif                    
set   @strTmp = @SqlSelect + '  top  ' +   CAST ( @pageSize   as   VARCHAR ( 4 )) + '   ' +   @fldName + '  from  ' + @tblName
None.gif                        
+ '  where  ' + @ID + '  <(select min( ' +   @ID   + ' ) from ( ' +   @SqlSelect + '  top  ' +   CAST ( @pageSize * ( @page - 1 as   Varchar ( 20 ))  + '   ' +   @ID   + '  from  ' + @tblName
None.gif                        
+ '  order by  ' +   @fldSort   + '   ' +   @strFSortType + ' ) AS TBMinID) '
None.gif                        
+ '  order by  ' +   @fldSort   + '   ' +   @strFSortType
None.gif                
end     
None.gif            
end
None.gif        
else
None.gif            
begin
None.gif            
set   @page   =   @pageIndex - @page + 1   -- 后半部分数据处理
None.gif
                 if   @page   <=   1   -- 最后一页数据显示                
None.gif
                     set   @strTmp = @SqlSelect + '  * from ( ' + @SqlSelect + '  top  ' +   CAST ( @lastcount   as   VARCHAR ( 4 )) + '   ' +   @fldName + '  from  ' + @tblName
None.gif                        
+ '  order by  ' +   @fldSort   + '   ' +   @strSortType + ' ) AS TempTB ' + '  order by  ' +   @fldSort   + '   ' +   @strFSortType  
None.gif                
else
None.gif                    
set   @strTmp = @SqlSelect + '  * from ( ' + @SqlSelect + '  top  ' +   CAST ( @pageSize   as   VARCHAR ( 4 )) + '   ' +   @fldName + '  from  ' + @tblName
None.gif                        
+ '  where  ' + @ID + '  >(select max( ' +   @ID   + ' ) from( ' +   @SqlSelect + '  top  ' +   CAST ( @pageSize * ( @page - 2 ) + @lastcount   as   Varchar ( 20 ))  + '   ' +   @ID   + '  from  ' + @tblName
None.gif                        
+ '  order by  ' +   @fldSort   + '   ' +   @strSortType + ' ) AS TBMaxID) '
None.gif                        
+ '  order by  ' +   @fldSort   + '   ' +   @strSortType + ' ) AS TempTB ' + '  order by  ' +   @fldSort   + '   ' +   @strFSortType  
None.gif            
end
None.gif    
end
None.gif
None.gif    
else   -- 有查询条件
None.gif
     begin
None.gif        
if   @pageIndex < 2   or   @page <= @pageIndex   /   2   +   @pageIndex   %   2     -- 前半部分数据处理
None.gif
         begin
None.gif                
if   @page = 1
None.gif                    
set   @strTmp = @SqlSelect + '  top  ' +   CAST ( @pageSize   as   VARCHAR ( 4 )) + '   ' +   @fldName + '  from  ' + @tblName                         
None.gif                        
+ '  where 1=1  '   +   @strCondition   +   '  order by  ' +   @fldSort   + '   ' +   @strFSortType
None.gif                
else
None.gif                
begin                     
None.gif                    
set   @strTmp = @SqlSelect + '  top  ' +   CAST ( @pageSize   as   VARCHAR ( 4 )) + '   ' +   @fldName + '  from  ' + @tblName
None.gif                        
+ '  where  ' + @ID + '  <(select min( ' +   @ID   + ' ) from ( ' +   @SqlSelect + '  top  ' +   CAST ( @pageSize * ( @page - 1 as   Varchar ( 20 ))  + '   ' +   @ID   + '  from  ' + @tblName
None.gif                        
+ '  where (1=1)  '   +   @strCondition   + '  order by  ' +   @fldSort   + '   ' +   @strFSortType + ' ) AS TBMinID) '
None.gif                        
+ '   ' +   @strCondition   + '  order by  ' +   @fldSort   + '   ' +   @strFSortType
None.gif                
end             
None.gif        
end
None.gif        
else
None.gif        
begin  
None.gif            
set   @page   =   @pageIndex - @page + 1   -- 后半部分数据处理
None.gif
             if   @page   <=   1   -- 最后一页数据显示
None.gif
                     set   @strTmp = @SqlSelect + '  * from ( ' + @SqlSelect + '  top  ' +   CAST ( @lastcount   as   VARCHAR ( 4 )) + '   ' +   @fldName + '  from  ' + @tblName
None.gif                        
+ '  where (1=1)  ' +   @strCondition   + '  order by  ' +   @fldSort   + '   ' +   @strSortType + ' ) AS TempTB ' + '  order by  ' +   @fldSort   + '   ' +   @strFSortType                      
None.gif            
else
None.gif                    
set   @strTmp = @SqlSelect + '  * from ( ' + @SqlSelect + '  top  ' +   CAST ( @pageSize   as   VARCHAR ( 4 )) + '   ' +   @fldName + '  from  ' + @tblName
None.gif                        
+ '  where  ' + @ID + '  >(select max( ' +   @ID   + ' ) from( ' +   @SqlSelect + '  top  ' +   CAST ( @pageSize * ( @page - 2 ) + @lastcount   as   Varchar ( 20 ))  + '   ' +   @ID   + '  from  ' + @tblName
None.gif                        
+ '  where (1=1)  ' +   @strCondition   + '  order by  ' +   @fldSort   + '   ' +   @strSortType + ' ) AS TBMaxID) '
None.gif                        
+ '   ' +   @strCondition + '  order by  ' +   @fldSort   + '   ' +   @strSortType + ' ) AS TempTB ' + '  order by  ' +   @fldSort   + '   ' +   @strFSortType                 
None.gif        
end     
None.gif    
end
None.gif
None.gif
-- ----返回查询结果-----
None.gif
exec  sp_executesql  @strTmp
None.gif
-- print @strTmp
None.gif
SET  NOCOUNT  OFF
None.gif
GO



转载于:https://www.cnblogs.com/azhai/archive/2005/12/21/302030.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值