本站启用国内永久域名: www.LewenSky.cn,请大家使用新域名访问网站!
9月21

sql server 分页方法集合

| |
11:41数据库技术  From: 本站原创

      最近在使用SQL查询数据库,做个小程序,但是在做到显示的时候遇到了个小问题:SQL Server没有分页的功能,只能自己写了。百度GOOGLE了一下,找了几个常用的方法,用起来效果还不错,分别是使用TOP关键词来对SQL Server进行分页操作,使用存储过程来对Sql Server来进行分页操作和使用上次读取的结果来进行操作。

      详细记录如下,希望对大家有用:)



方法一:SQL查询分页

引用

select top 10 * from basicinfor where eid not in (select top 20 eid from basicinfor order by ename) order by ename

其中 10: 是 你每页显示的行数 ,可以通过参数获得。

后面的20: 是10×2(2 是第几页)得到的。

这句的sql 查询 其实 就是 每页10条记录的第3页记录打印出来的sql 语句。

还要提醒下 ,如果查询带条件 后面的子查询也要带上条件:

select top 10 * from basicinfor where ename like '%albaba%' and eid not in (select top 20 eid from basicinfor where  ename like '%albaba%' order by ename) order by ename

这样查询出来的数据只有10条,效率远远大于 网上一般的 查询出所有记录然后在list 里面遍历出 想要的10条记录 效率要大的多,特别是在表中数据多的情况下 。

原文:http://blog.csdn.net/lioushuei/archive/2009/01/14/3777318.aspx

方法二:使用存储过程
引用

CREATE PROC Turnpage
    @qCols varchar(200),                 --需要查询的列
    @qTables         varchar(200),       --需要查询的表 和条件
    @iKey         varchar (20),          --标识字段
    @oKey        varchar(20),            --排序字段
    @pageSize         int,               --每页的行数
    @pageNumber       int                --要显示的页码, 从0开始
AS
set nocount on
BEGIN
    DECLARE @sqlText AS varchar(1000)
    DECLARE @sqlTable AS varchar(1000)
    SET @sqlTable = 'SELECT TOP ' + CAST((@pageNumber + 1) * @pageSize AS varchar(30)) + ' ' + @qCols +' from '+ @qTables + ' order by '+@oKey+ ' desc'
    SET @sqlText =
        'SELECT TOP ' + CAST(@pageSize AS varchar(30)) + ' * ' +
        'FROM (' + @sqlTable + ') AS tableA ' +
        'WHERE ' + @iKey + ' NOT IN(SELECT TOP ' +
        CAST(@pageNumber * @pageSize AS varchar(30)) + ' ' + @iKey +
        ' FROM (' + @sqlTable + ') AS tableB)'
  EXEC (@sqlText)
--print(@sqltext)
END
GO

原文:http://blogger.org.cn/blog/more.asp?name=dml&id=25237

方法3:记录上次读取的记录
引用

sqlserver中没有类似oralce中的伪列。所以不能用这个属性来进行分页。

这是我最近搞的一个关于sqlserver的分页,不知道对你有没有帮助:

我们知道,sqlserver中,top关键字是用来取前n条记录的。如果想得到查询结果集中的前20条数据,则sql语句如下:
select top 20 *   from x_user ;
方法1:
对于一般的表,id都是基于一种规则顺序往下走的。一般情况下,是自动增一的。这里也就只能讨论这种情况,对于个别的情况,如果以后项目遇到了,我会再继续玩玩得。不过对于目前绝大多数的id自增的情况是适用的。所以,我们可以钻一个空子:
select top 20 *   from x_user order by uid ;

这样,就可以根据uid来排序进行取数据的操作。这是第一页的情况。由于id是自增的,所以第二页的第一条记录的id肯定比上一页的大。并且都是顺序排列的。因此,第二页的sql可以如下表示:
select top 20 *   from x_user where uid > 上一页最后的id order by uid ;

第三页,第四页...... 以此类推。只要找到上一页的最后一个id就行了。

哈哈。相当简单的吧。这是下一页的操作。至于上一页,用法是一样的。不过这里需要注意的是:上一页的条数的那个id需要减去2倍的每页显示条数。这是为什么呢?

举例说明:

1,2,3,4,5    第一页  最后的id = 5
6,7,8,9,10   第二页  最后的id = 10
11,12,13,14 ,15  第三页  最后的id = 15

我们从第一页翻到第二页的sql是:select top 20 *   from x_user where uid > 5 order by uid ;记住,这个id是5!!
假如我们从第三页想返回第二页。第三页的最后一个id是15。所以15-5=10 。正好是每页显示条数的2倍。
换句话说,从第三页返回到第二页,这个sql语句中的id其实记录的是第一页的最后一个id。所以需要减去2倍的每页显示条数。

方法2 :
用between ... and ... 关键字。
select top 20 *   from x_user where uid between 10 and 20 order by uid;
这样直接就能得到啦。省事吧?不过这2种都仅限于id是那种规则自增的方式。如果你非要搞个随机数,日期什么的。恐怕就不行了。不过谁还用那玩意啊?对于绝大多数的项目都好使就行啊。哈哈


原文:http://blog.csdn.net/afterRain/archive/2008/05/08/2417090.aspx


作者:Lewen@博雅宇轩
地址:http://www.lewensky.cn/read.php/340.htm
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最新日志 随机日志 综合排行
  • OFFICE 2010 VOL...
  • 格式工厂绿色版 V2.90
  • Password Invent...
  • VideoCacheView ...
  • 电脑店U盘启动盘制作工具 3....
  • 阿里旺旺AliIM2011_7...
  • 极点五笔十周年纪念版
  • PPTV网络电视3.1.1.0...
  • WinRAR注册方法
  • 紫光华宇拼音输入法 6.8.0...
  • QQ2011 Beta3(22...
  • VC6.0 C4786编译警告
  • MFC 文本文件的简单操作
  • PPS影音 V2.7.0.11...
  • PPS网络电视 v2.6.86...
  • 中华人民共和国分省地图册V1....
  • SearchMyFiles 1...
  • 射手影音播放器前卫版 V3.5...
  • USBDeview 1.50 ...
  • 四种游泳姿势的动画图解
  • 安装软件时出现系统提示&quo...
  • XP与XP无线共享设置(笔记本...
  • ZineMaker目录模板大集...
  • 没有不可能 轻松实现PDG转P...
  • CString转char的方法...
  • [转]MSDN精简版、MSDN...
  • 将IE、FIREFOR (火狐...
  • VC多线程编程(转)
  • MyEclipse6.5下载地...
  • Diskeeper 2010 ...
  • 阅读(3182) | 评论(0) | 引用(0)
    发表评论
    表情
    emotemotemotemotemot
    emotemotemotemotemot
    emotemotemotemotemot
    emotemotemotemotemot
    emotemotemotemotemot
    打开HTML
    打开UBB
    打开表情
    隐藏
    记住我
    昵称   密码   游客无需密码
    网址   电邮   [注册]