SQL的颁布就麻烦一些:查询第X页,每页Y条记录最基本的处理方法(原理):如果表中有主键(记录不重复的字段也可以),可以用类似下面的方法,当然y,(x-1)*y要换成具体的数字,不能用变量:select top y * from 表 where 主键 not in(select top (x-1)*y 主键 from 表)如果表中无主键,可以用临时表,加标识字段解决.这里的x,y可以用变量.select id=identity(int,1,1),*  into #tb from 表
select * from #tb where id between (x-1)*y and x*y-1

解决方案 »

  1.   

    to  zjcxc(邹建) 
    我今天专门试过这种方法
    一共做了1千万条数据
    select top 20 * from a where id not in(select top 9000000 id from a)
    这样,我的机器p4 2G 512M 还是要12秒的
    越到后面,数据量越大,不是就越慢?
    (其中就两个字段ID是主建,还有一个Name)
    还有好方法不?
      

  2.   

    --你可以试试SQL自带的分页
    /*--利用SQL未公开的存储过程实现分页

    方法简单且效率高,已知的问题就是要多返回一个空的记录集 解决的方法是在前台调用时,用 set recordset=recordset.nextrecordset
    的方法跳过第一个记录集

    此方法由J9988提供,我只是将它改成了方便调用的存储过程--邹建 2004.05(引用请保留此信息)--*//*--调用示例

    exec p_splitpage 'select id,name from sysobjects where xtype=''U'' order by id',1,5
    --*/
    create procedure p_splitpage   
    @sql nvarchar(4000), --要执行的sql语句
    @currentpage int=2,  --要显示的页码
    @pagesize int=10, --每页的大小
    @pagecount int=0 out --总页数
    as
    set nocount on
    declare @p1 intexec sp_cursoropen @p1 output,@sql,@scrollopt=1,@ccopt=1,@rowcount=@pagecount outputselect @pagecount=ceiling(1.0*@pagecount/@pagesize)
    ,@currentpage=(@currentpage-1)*@pagesize+1
    exec sp_cursorfetch @p1,16,@currentpage,@pagesize 
    exec sp_cursorclose @p1
    go
      

  3.   

    to zjcxc(邹建) 
    你的那个sql server的内部的存储过程
    我试过了
    竟然要创建好大一个tempdb
    不知道,你测试过没有?
    说不定,是我测试的方法不对
      

  4.   

    用游标的方法也是效率不高的http://dev.csdn.net/develop/article/43/43936.shtm
      

  5.   

    使用top的办法是sqlserver比较常用的,但你可以考虑不使用not in,使用not in的速度比较慢,可以考虑使用外连接来做
    select top y * from 表 a  RIGHT OUTER JOIN (select top (x-1)*y 主键 from 表 b)
    on A.主键=B.主键 where A.主键 is null