Code

/*********************************************************  

* 作    用:数据分页(完整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  

SQL2005分页存储过程(支持多表联接)的更多相关文章

  1. SQL 单表分页存储过程和单表多字段排序和任意字段分页存储过程

      第一种:单表多字段排序分页存储过程       --支持单表多字段查询,多字段排序 create PROCEDURE [dbo].[UP_GetByPageFiledOrder] ( ), --表 ...

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

    http://www.cnblogs.com/andiki/archive/2009/03/24/1420289.html Code/********************************* ...

  3. sql server 2000 单主键高效分页存储过程 (支持多字段排序)

    sql server 2000 单主键高效分页存储过程 (支持多字段排序) Create PROC P_viewPage             /*              nzperfect [ ...

  4. 高效sql2005分页存储过程

    高效分页存储过程 --分页存储过程示例 Alter PROCEDURE [dbo].[JH_PageDemo] @pageSize int = 9000000000, @pageIndex int = ...

  5. SQL - 分页存储过程

    http://www.jb51.net/article/71193.htm http://www.webdiyer.com/utils/spgenerator/ create PROCEDURE [d ...

  6. 支持DISTINCT的通用分页存储过程(SQL2005)

    /****** 对象: StoredProcedure [dbo].[P_CommonPagination] 脚本日期: 07/22/2009 10:22:01 ******/ SET ANSI_NU ...

  7. SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程(支持单表或多表结查集分页)

    SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程,支持单表或多表结查集分页,存储过程如下: /******************/ --Author:梦在旅 ...

  8. SqlServer分页存储过程(多表查询,多条件排序),Repeater控件呈现数据以及分页

        存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出 ...

  9. 分页存储过程--From:桌面备份 -> sql2005新功能.docx

    二.以下示例将返回行号为 50 到 60(含)的行,并以 OrderDate 排序. USE AdventureWorks; GO WITH OrderedOrders AS (SELECT Sale ...

随机推荐

  1. libgdx学习记录17——照相机Camera

    照相机在libgdx中的地位举足轻重,贯穿于整个游戏开发过程的始终.一般我们都通过Stage封装而间接使用Camera,同时我们也可以单独使用Camera以完成背景的移动.元素的放大.旋转等操作. C ...

  2. it面试技巧

    一:请你自我介绍一下你自己? 回答提示:一般人回答这个问题过于平常,只说姓名.年龄.爱好.工作经验,这些在简历上都有.其实,企业最希望知道的是求职者能否胜任工作,包括:最强的技能.最深入研究的知识领域 ...

  3. 新员工入门 - for测试

    23456人员介绍 XXX 测试工作 [软件] Chrome 浏览器.jsonviewer.Firefox.FireBug HTTP协议与抓包 - fildder.wireshirk等 DB查询工具 ...

  4. Flask学习-Flask app启动过程

    因为0.1版本整体代码大概只有350行,比较简单.所以本篇文章会以Flask 0.1版本源码为基础进行剖析Flask应用的启动过程. Flask参考资料flask,官网有一个最简单app: from ...

  5. 移动端jq及zepto事件绑定

    最近做移动端网页,用到了zepto.js , 其大致用法跟 jquery 差不多,但是在时间绑定的时候被困了好久的坑. 这里说的主要是给未来元素绑定事件.未来元素:这里指的是通过 ajax 请求得到数 ...

  6. 关于使用单片机读取外部电压ADC阻抗匹配的问题

    单片机的基准电压一般为3.3V,如果外部信号超过了AD测量范围,可以采用电阻分压的方法,但是要注意阻抗匹配问题.比如,SMT32的模数输入阻抗约为10K,如果外接的分压电阻无法远小于该阻值,则会因为信 ...

  7. mac10.12.6系统使用cmake安装opencv3.3.0+opencv_contrib-3.3.0

    brew与cmake brew安装 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/ins ...

  8. unity2D限制位置的背景移动补偿效果

    有时候我们想要背景可以跟随相机移动补偿,但是又不想该背景物体离原来的位置太远,比如我们想要一棵树在一个房子的后面,然后使用相机补偿使其跟随移动,达到3D错觉效果,但是我们又不想该物体偏离房屋太远.假设 ...

  9. PAT甲题题解-1122. Hamiltonian Cycle (25)-判断路径是否是哈密顿回路

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789799.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  10. (第十二周)Bug修正报告

    根据Debug周各组找出的Bug,现做出如下说明: Bug: 一.天天向上团队 看到的现象:当食物链长度很长时,最长链显示不全.如下图: 期待的现象:当食物链过长时,食物链可以自动换行. 二者的差异: ...