这里我用一表来举例 表名为 AddressSheng,主键ID自动增长,AddressName是省的名称

1、select ID,AddressName from (select *,Row_Number() over(order by ID DESC)RowNumber from   AddressSheng)t where t.RowNumber>=((pageNumber-1)*pageSize+1) and t.RowNumber<=pageNumber*pageSize

pageNumber是查第几页的数据,第几页是从1开始的而不是0 因此我命名为pageNumber而不是pageIndex

pageSize是页容量,意思是每页显示多少条数据,其他的不必说了吧,记住一个公式就可以了

n为页码 s为页容量

t.RowNumber>=(n-1)*s+1 and t.RowNumber<=n*s

OK现在我们把它变成存储过程

create proc GetPageContentByPageNumber
(
@pageNumber int,             --输入参数页码
@pageSize int,                  --页容量
@rowCount int output,      --输出参数数据总数
@pageCount int output      --输出参数总页数
)
as
Begin
 declare @sql nvarchar(512)
 select @rowCount=count(id),@pageCount=ceiling((count(id)+0.00)/@pageSize) from AddressSheng
 set @sql ='select ID,AddressName from (select *,Row_Number() over(order by ID DESC)RowNumber from AddressSheng)t where t.RowNumber>='+str((@pageNumber-1)*@pageSize+1)+' and t.RowNumber<='+str(@pageNumber*@pageSize)
 print @sql
    exec (@sql)
   
End

--------------------------------------以下是调用存储过程-----------------------------------------------------

declare @pageNumber int,@pageSize int,@rowCount int,@pageCount int
exec GetPageContentByPageNumber

2,                       --请求第2页的数据
3,                       --页容量为3
@rowCount output,   --数据总量
@pageCount output  --总页数

这就是个分页请求数据的存储过程,我得说说原理,主要用的是Row_Number()这个函数来实现的分页,这个函数是Ms-SqlServer2000之后才有的,使用Row_Numer()函数会生成一列连续的自动增长的编号,由于我们差分页数据的时候,比如主键是自动增长列,那么主键就有可能是不连续的,所以我们用Row_Number()为它生成一个连续的序列号。ceiling(m)函数,我喜欢把它通俗的称作天花板函数,顾名思义就是往上取值,究竟是取得什么值呢?取不小于m的最大整数,举个例子  ceiling(1)=1;ceiling(1.1)=2;ceiling(1.7)=2 这么举例是不是更容易理解呢?在这里需要注意的是设置为黄色背景的括号一定不能省略否则结果是错误的,OK 这种方法的分页就说到这里.

2、

select top pageSize from AddressSheng where ID not in (select top (pageNumber-1)*pageSize ID from AddressSheng)

pageNumber依然是页码号,pageSize依然是页容量,这里又一个公式我用黄色背景做标注。

下面是存储过程

create proc GetPageContentByPageNumber
(
 @pageNumber int,
 @pageSize int,
 @rowCount int output,
 @pageCount int output
)
as
Begin
 declare @sql nvarchar(512)
    select @rowCount=count(id),@pageCount=ceiling((count(id)+0.00)/@pageSize) from AddressSheng
 set @sql='select top '+str(@pageSize)+' * from AddressSheng where id not in (select top '+str((@pageNumber-1)*@pageSize)+' id from AddressSheng)'
    print @sql
 exec(@sql)
End

declare @pageNumber int,@pageSize int,@rowCount int,@pageCount int
exec t
2,
3,
@rowCount output,
@pageCount output

这种分页方式主要是用not in关键字来实现的,具体说一下比如我们要查询页码2的数据页容量为3,先计算出第一页的ID,然后在查询3条数据(pageSize),这时就有一个条件了是要查询出的数据的ID不包含刚刚查询出来的ID中,这样自然而然查询到的就是第2页的数据,str()函数是把括号的内容转换成字符串。简单吗?呵呵?

3、

select top 3 from AddressShent where ID>(select max(ID) from (select top (pageNumber-1)*pageSize  ID from AddressSheng) as t)

存储过程:

create proc tt
(
 @pageNumber int,
 @pageSize int,
 @rowCount int output,
 @pageCount int output
)
as
Begin
 declare @sql nvarchar(512)
    select @rowCount=count(id),@pageCount=ceiling((count(id)+0.00)/@pageSize) from AddressSheng
 set @sql='select top '+str(@pageSize)+' * from AddressSheng where ID>(select max(id) from (select top '+str((@pageNumber-1)*@pageSize)+' from AddressSheng) as t)'
    print @sql
 exec(@sql)
End

declare @pageNumber int,@pageSize int,@rowCount int,@pageCount int
exec t
2,
3,
@rowCount output,
@pageCount output

还是说说这种方法的原理,这里用到了一个函数max() 得到该列的最大值,比如max(ID)意思就是得到最大的ID号.

这种分页的方式也较为简单,我剖析下原理,拿到请求的页码以及页容量,页码-1就是上一页的数据,查出请求页上一页的数据然后得到它的最大的ID号,然后再从表中查若干条数据(pageSize)过滤条件是这些数据的ID大于刚刚查询出的最大ID号,这样我们不就实现了吗?是不是还挺简单?

总结:每种方式都各有优缺点,简单的说一下,第三种方式只能用在主键为自动增长列的表中,因为他要得到最大的ID号,如果是表主键是时间戳类型他就不灵了,第一种和第二种则没有这个缺陷。在从效率上来讲第一种是比第二种和第一种的效率高,然后第三种比第二种效率高。具体使用哪种是不是也分析出来了呢?时间太晚了今天就不比较效率了,在我的下一篇博客中我会用具体的方式测试下着三种分页的方式,咱在深入一步。郑重声明本人也是菜鸟,如果说的不正确的情况欢迎探讨莫要谩骂哦,欢迎经常来访。

转载于:https://www.cnblogs.com/GodIsBoy/archive/2013/03/06/getPageContent.html

分页SQL语句/存储过程(.net/SQL技术交流群206656202 入群需注明博客园)相关推荐

  1. 在Oracle中不通过存储过程一次执行多条SQL语句Oracle PL/SQL

    PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL ...

  2. Java中如何解析SQL语句、格式化SQL语句、生成SQL语句?

    昨天在群里看到有小伙伴问,Java里如何解析SQL语句然后格式化SQL,是否有现成类库可以使用? 之前TJ没有做过这类需求,所以去研究了一下,并找到了一个不过的解决方案,今天推荐给大家,如果您正要做类 ...

  3. tp5获取sql_tp5 sql语句 tp5 获取sql语句

    tp5 sql语句 tp5 获取sql语句以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! sql语句转换成tp5执行,求 ...

  4. sql语句优化之SQL Server

    MS   SQL   Server查询优化方法 查询速度慢的原因很多,常见如下几种 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)          2.I/O吞吐量小,形成 ...

  5. oracle 执行带参数的sql语句_Oracle动态SQL语句的简单执行

    在使用ODP.NET进行Oracle编程时,有时候SQL语句非常复杂,需要采用动态构造查询语句的情况,有两种方法可以构造动态的SQL语句,并执行返回结果集. 1.在数据访问层构造SQL语句 例如下面的 ...

  6. mysql高效sql语句_高效SQL优化 非常好用的SQL语句优化34条

    高效SQL优化 非常好用的SQL语句优化34条 相关软件相关文章发表评论 来源:2011/2/13 9:38:43字体大小: 作者:佚名点击:576次评论:0次标签: 类型:电子教程大小:8.5M语言 ...

  7. SQL语句学习之SQL基础的表创建以及添加数据

    SQL语句学习之SQL基础的表创建以及添加数据 学习目标1: 一周内掌握SQL基础语句 tip:主要是在牛客网(牛客网)上进行练习,里面有在线编程,可以直接运行,而且有解题的思路,比较清晰,而且容易了 ...

  8. Xposed 之旅 -- 查看微信群成员入群方式

    本文仅做技术交流学习使用,用于其它违法行为的与本作者无关! 最近在研究xposed写插件,发现这个真的有毒,会上瘾,写上根本停不下来.那么就来说说最近写的一个,非群主查看群成员入群方式,正常情况下,群 ...

  9. java分页sql语句_「sql分页」sql语句 实现分页 - seo实验室

    sql分页 sql语句 实现分页 /* 分页思想:比如你要每页获取10条记录,当你显示第5页的记录时, 也就是选取第40条至50条的记录.首先应该从所有的记录集中选取 50条记录,同时进行倒序,再从中 ...

  10. 一个很好用的DBHelper类(包括使用SQL语句 存储过程 事务 做相关操作) 入门级

    话不多少 直接贴代码 需引入的命名空间 需引入的命名空间 定义连接属性 SQL连接对象 private SqlConnection conn;public SqlConnection Conn {ge ...

最新文章

  1. String比较.equals
  2. wamp安装多版本php,WampServer安装多个php版本
  3. 开通博客的第一篇随笔~
  4. 加强IIS安全机制 建立高安全性能Web服务器
  5. c语言 倒计时不清屏_打字游戏超细讲解(C语言基础小游戏)
  6. [转] Boost智能指针——scoped_ptr
  7. Oracle游标有何用,Oracle游标使用方法有哪些?
  8. mysql 删除版本信息_linux 删除mysql
  9. 为什么要使用面向对象编程
  10. 4键电子手表说明书_飞猪II控制台简体中文说明书
  11. ViewPager+Fragment实现支持左右滑动的Tab
  12. ubuntu16.04 运行dso问题梳理
  13. Ugly Numbers UVA - 136
  14. 7.大数据架构详解:从数据获取到深度学习 --- 批处理技术
  15. OpenCV-特征提取与检测(03、自定义角点检测器)
  16. linux .deb后缀文件,tar.gz和bin,以及rpm,deb等linux后缀的文件的区别
  17. 量化投资学习——统计套利综述
  18. Backtrader简单均线交易策略“金叉和死叉”
  19. update在python中是什么意思_update()与save()有什么区别
  20. excel高级筛选怎么用_Excel教程:用高级筛选做超级拆分器

热门文章

  1. javax.naming.NameNotFoundException: QueueConnectionFactory not bound
  2. 关于“未能打开文稿 文本编码Unicode(UTF-8)不适用”的解决办法
  3. Mac电脑壁纸 Mac动态壁纸 小镇冬日夜景动态壁纸
  4. Mac上如何在“系统信息”中查看是否兼容新产品?
  5. 苹果发布高端头戴式耳机AirPods Max12月15日发售
  6. iMazing六大主要功能介绍
  7. 少编码多思考:代码越多 问题越多
  8. Hystrix相关属性说明
  9. Dreamer 框架 比Struts2 更加灵活
  10. VirtualBox中安装Ubuntu、LAMP、SVN、JRE和Tomcat