完整SQL分页存储过程(支持多表联接)

/* ********************************************************  
* 作    用:数据分页(完整SQL分页存储过程(支持多表联接))
* 作    者:齐李平
* 创建日期:2009-03-23
* 使用说明:
    1、单表调用方法:EXEC proc_DataPagination @tblName = 'ipa',@fldName = '*',@pageSize =50,@page = 6789,@fldSort = '',@Sort = 1,@strCondition = '',@ID = 'id',@Dist = 0,@pageCount = null,@Counts = NULL
    2、多表调用方法:EXEC proc_DataPagination @tblName = 'Info LEFT JOIN InfoType it ON it.typeid=Info.tid',@fldName = 'info.*,it.tname',@pageSize =50,@page = 1806,@fldSort = '',@Sort = 0,@strCondition = '',@ID = 'id',@Dist = 0,    @pageCount = null,@Counts = NULL    
* 多表联合查询使用需注意:1、多表中的主键字段不能为相同的名称。2、多表中不能允许具有相同名称的字段,如果存在相同名称的字段你可以使用AS重命名
********************************************************
*/   
 
alter   PROCEDURE   [ dbo ] . [ proc_DataPagination ]   
 (  
 
@tblName       nvarchar ( 200 ),         -- --要显示的表或多个表的连接  
  @fldName       nvarchar ( 500 =   ' * ' ,     -- --要显示的字段列表  
  @pageSize      int   =   10 ,         -- --每页显示的记录个数  
  @page          int   =   1 ,         -- --要显示那一页的记录  
  @fldSort      nvarchar ( 200 =   null ,     -- --排序字段列表或条件  
  @Sort          bit   =   0 ,         -- --排序方法,1为升序,0为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ')  
  @strCondition      nvarchar ( 1000 =   null ,     -- --查询条件,不需where  
  @ID          nvarchar ( 150 ),         -- --主表的主键  
  @Dist        bit   =   0 ,            -- --是否添加查询字段的 DISTINCT 默认0不添加/1添加  
  @pageCount      int   =   1  output,             -- --查询结果分页后的总页数  
  @Counts      int   =   1  output                 -- --查询到的记录数  
 )  
 
AS   
 
SET  NOCOUNT  ON   
 
Declare   @sqlTmp   nvarchar ( 1000 )         -- --存放动态生成的SQL语句  
  Declare   @strTmp   nvarchar ( 1000 )         -- --存放取得查询结果总数的查询语句  
  Declare   @strID       nvarchar ( 1000 )         -- --存放取得查询开头或结尾ID的查询语句  
   
 
Declare   @strSortType   nvarchar ( 10 )     -- --数据排序规则A  
  Declare   @strFSortType   nvarchar ( 10 )     -- --数据排序规则B  
   
 
Declare   @SqlSelect   nvarchar ( 50 )          -- --对含有DISTINCT的查询进行SQL构造  
  Declare   @SqlCounts   nvarchar ( 50 )           -- --对含有DISTINCT的总数查询进行SQL构造  
   
   
 
if   @Dist    =   0   
 
begin   
     
set   @SqlSelect   =   ' select  '   
     
set   @SqlCounts   =   ' Count(0) '   
 
end   
 
else   
 
begin   
     
set   @SqlSelect   =   ' select distinct  '   
     
set   @SqlCounts   =   ' Count(DISTINCT  ' + @ID + ' ) '   
 
end   
   
   
 
if   @Sort = 0   
 
begin   
     
set   @strFSortType = '  DESC  '   
     
set   @strSortType = '  DESC  '   
 
end   
 
else   
 
begin   
     
set   @strFSortType = '  ASC  '   
     
set   @strSortType = '  ASC  '   
 
end   
   
if ( @fldSort   is   not   null   and   @fldSort <> '' )
begin
    
set   @fldSort = ' , ' + @fldSort
end
else
begin
    
set   @fldSort = '   '
end
   
 
-- ------生成查询语句--------  
  -- 此处@strTmp为取得查询结果数量的语句  
  if   @strCondition   is   null   or   @strCondition = ''       -- 没有设置显示条件  
  begin   
     
set   @sqlTmp   =    @fldName   +   '  From  '   +   @tblName   
     
set   @strTmp   =   @SqlSelect + '  @Counts= ' + @SqlCounts + '  FROM  ' + @tblName   
     
set   @strID   =   '  From  '   +   @tblName   
 
end   
 
else   
 
begin   
     
set   @sqlTmp   =   +   @fldName   +   ' From  '   +   @tblName   +   '  where (1>0)  '   +   @strCondition   
     
set   @strTmp   =   @SqlSelect + '  @Counts= ' + @SqlCounts + '  FROM  ' + @tblName   +   '  where (1>0)  '   +   @strCondition   
     
set   @strID   =   '  From  '   +   @tblName   +   '  where (1>0)  '   +   @strCondition   
 
end   
   
 
-- --取得查询结果总数量-----  
  exec  sp_executesql  @strTmp ,N ' @Counts int out  ' , @Counts  out  
 
declare   @tmpCounts   int   
 
if   @Counts   =   0   
     
set   @tmpCounts   =   1   
 
else   
     
set   @tmpCounts   =   @Counts   
   
     
-- 取得分页总数  
      set   @pageCount = ( @tmpCounts + @pageSize - 1 ) / @pageSize   
   
     
/**//* *当前页大于总页数 取最后一页* */   
     
if   @page > @pageCount   
         
set   @page = @pageCount   
   
     
-- /*-----数据分页2分处理-------*/  
      declare   @pageIndex   int   -- 总数/页大小  
      declare   @lastcount   int   -- 总数%页大小   
   
     
set   @pageIndex   =   @tmpCounts / @pageSize   
     
set   @lastcount   =   @tmpCounts % @pageSize   
     
if   @lastcount   >   0   
         
set   @pageIndex   =   @pageIndex   +   1   
     
else   
         
set   @lastcount   =   @pagesize   
  
 
-- 为配合显示  
  -- set nocount off  
  -- select @page curpage,@pageSize pagesize,@pageCount countpage,@tmpCounts [Rowcount]  
  -- set nocount on  
  
  
-- //***显示分页  
      if   @strCondition   is   null   or   @strCondition = ''       -- 没有设置显示条件  
      begin   
         
if   @pageIndex < 2   or   @page <= @pageIndex   /   2   +   @pageIndex   %   2     -- 前半部分数据处理  
              begin    
                 
if   @page = 1   
                     
set   @strTmp = @SqlSelect + '  top  ' +   CAST ( @pageSize   as   VARCHAR ( 40 )) + '   ' +   @fldName + '  from  ' + @tblName                           
                         
+ '  order by  ' +   @ID + '   ' +   @strFSortType + @fldSort
                 
else   
                 
begin                       
                     
set   @strTmp = @SqlSelect + '  top  ' +   CAST ( @pageSize   as   VARCHAR ( 40 )) + '   ' +   @fldName + '  from  ' + @tblName   
                         
+ '  where  ' + @ID   
                     
if   @Sort = 0   
                        
set   @strTmp   =   @strTmp   +   ' >(select max( '   
                     
else   
                        
set   @strTmp   =   @strTmp   +   ' <(select min( '   
                     
set   @strTmp   =   @strTmp   +   @ID   + ' ) from ( ' +   @SqlSelect + '  top  ' +   CAST ( @pageSize * ( @page - 1 as   Varchar ( 20 ))  + '   ' +   @ID   + '  from  ' + @tblName   
                         
+ '  order by  ' +   @ID + '   ' +   @strFSortType + @fldSort + ' ) AS TBMinID) '   
                         
+ '  order by  ' +   @ID + '   ' +   @strFSortType + @fldSort
                 
end       
             
end   
         
else   
               
             
begin   
             
set   @page   =   @pageIndex - @page + 1   -- 后半部分数据处理  
                  if   @page   <=   1   -- 最后一页数据显示              
                      set   @strTmp = @SqlSelect + '  * from ( ' + @SqlSelect + '  top  ' +   CAST ( @lastcount   as   VARCHAR ( 40 )) + '   ' +   @fldName + '  from  ' + @tblName   
                         
+ '  order by  ' +   @ID   + '   ' +   @strSortType + @fldSort + ' ) AS TempTB ' + '  order by  ' +   @ID + '   ' +   @strFSortType + @fldSort  
                 
else   
                     
begin   
                     
set   @strTmp = @SqlSelect + '  * from ( ' + @SqlSelect + '  top  ' +   CAST ( @pageSize   as   VARCHAR ( 40 )) + '   ' +   @fldName + '  from  ' + @tblName   
                         
+ '  where  ' + @ID   
                         
if   @Sort = 0   
                            
set   @strTmp = @strTmp + '  <(select min( '   
                         
else   
                            
set   @strTmp = @strTmp + '  >(select max( '   
  
set   @strTmp = @strTmp +   @ID   + ' ) from( ' +   @SqlSelect + '  top  ' +   CAST ( @pageSize * ( @page - 2 ) + @lastcount   as   Varchar ( 20 ))  + '   ' +   @ID   + '  from  ' + @tblName   
                         
+ '  order by  ' +   @ID   + '   ' +   @strSortType + @fldSort + ' ) AS TBMaxID) '   
                         
+ '  order by  ' +   @ID   + '   ' +   @strSortType + @fldSort + ' ) AS TempTB ' + '  order by  ' +   @ID + '   ' +   @strFSortType + @fldSort  
                    
end   
             
end   
   
     
end   
   
     
else   -- 有查询条件  
      begin   
         
if   @pageIndex < 2   or   @page <= @pageIndex   /   2   +   @pageIndex   %   2     -- 前半部分数据处理  
          begin   
                 
if   @page = 1   
                     
set   @strTmp = @SqlSelect + '  top  ' +   CAST ( @pageSize   as   VARCHAR ( 40 )) + '   ' +   @fldName + '  from  ' + @tblName                           
                         
+ '  where 1=1  '   +   @strCondition   +   '  order by  ' +   @ID + '   ' +   @strFSortType + @fldSort
                 
else   
                 
begin                       
                     
set   @strTmp = @SqlSelect + '  top  ' +   CAST ( @pageSize   as   VARCHAR ( 40 )) + '   ' +   @fldName + '  from  ' + @tblName   
                         
+ '  where  ' + @ID   
                     
if   @Sort = 0   
                        
set   @strTmp   =   @strTmp   +   ' >(select max( '   
                     
else   
                        
set   @strTmp   =   @strTmp   +   ' <(select min( '   
   
                  
set   @strTmp   =   @strTmp   +   @ID   + ' ) from ( ' +   @SqlSelect + '  top  ' +   CAST ( @pageSize * ( @page - 1 as   Varchar ( 20 ))  + '   ' +   @ID   + '  from  ' + @tblName   
                         
+ '  where (1=1)  '   +   @strCondition   + '  order by  ' +   @ID + '   ' +   @strFSortType + @fldSort + ' ) AS TBMinID) '   
                         
+ '   ' +   @strCondition   + '  order by  ' +   @ID + '   ' +   @strFSortType + @fldSort
                 
end               
         
end   
         
else   
         
begin    
             
set   @page   =   @pageIndex - @page + 1   -- 后半部分数据处理  
              if   @page   <=   1   -- 最后一页数据显示  
                      set   @strTmp = @SqlSelect + '  * from ( ' + @SqlSelect + '  top  ' +   CAST ( @lastcount   as   VARCHAR ( 40 )) + '   ' +   @fldName + '  from  ' + @tblName   
                         
+ '  where (1=1)  ' +   @strCondition   + '  order by  ' +   @ID   + '   ' +   @strSortType + @fldSort + ' ) AS TempTB ' + '  order by  ' +   @ID + '   ' +   @strFSortType + @fldSort                      
             
else   
                   
begin   
                     
set   @strTmp = @SqlSelect + '  * from ( ' + @SqlSelect + '  top  ' +   CAST ( @pageSize   as   VARCHAR ( 40 )) + '   ' +   @fldName + '  from  ' + @tblName   
                         
+ '  where  ' + @ID   
                     
if   @Sort = 0   
                        
set   @strTmp   =   @strTmp   +   ' <(select min( '   
                     
else   
                        
set   @strTmp   =   @strTmp   +   ' >(select max( '   
                
set   @strTmp   =   @strTmp   +   @ID   + ' ) from( ' +   @SqlSelect + '  top  ' +   CAST ( @pageSize * ( @page - 2 ) + @lastcount   as   Varchar ( 20 ))  + '   ' +   @ID   + '  from  ' + @tblName   
                         
+ '  where (1=1)  ' +   @strCondition   + '  order by  ' +   @ID   + '   ' +   @strSortType + @fldSort + ' ) AS TBMaxID) '   
                         
+ '   ' +   @strCondition + '  order by  ' +   @ID   + '   ' +   @strSortType + @fldSort + ' ) AS TempTB ' + '  order by  ' +   @ID + '   ' +   @strFSortType + @fldSort   
                  
end                 
         
end       
     
     
end   
   
 
-- ----返回查询结果-----  
SET  NOCOUNT  off   
 
exec  sp_executesql  @strTmp   
print   @strTmp   

你可能感兴趣的:(存储过程)