本来网上找的海量分页方法,就是top 20 .... where id>.......这样
但是如果作为主键的ID如果乱掉的话,是没办法排序的.
我现在就遇到这种问题,网上找了一下,2005里很支持分页
select * from(select OrderId, Freight, ROW_NUMBER() OVER(order by Freight) as row from Orders) a 
where row between 20 and 30 
这样就行了不过我地方没办法用2005,所以得从2000地方想办法了,谁知道2000里,怎么实现2005里的ROW_NUMBER() 涵数功能

解决方案 »

  1.   

    在数据库中实现分页,必须考虑服务器的性能,海量数据尽量不要在数据库中分页,用临时表会增大temp数据库,和I/O操作,尽量做在前端程序中!
      

  2.   

    create PROCEDURE dbo.GetPagingRecord 
        ( 
            @tablename varchar(100),--表名或视图表 
            @fieldlist varchar(4000)='*',--欲选择字段列表 
            @orderfield varchar(100),--排序字段 
            @keyfield varchar(100),--主键 
            @pageindex int,--页号,从0开始 
            @pagesize int=20,--页尺寸 
            @strwhere varchar(4000),--条件 
            @ordertype bit=1--排序,1,降序,0,升序 
        ) 
    AS 
    /**//* 
    名称:GetPagingRecord 
    作用:按任意字段进行排序分页 
    作者:菩提树(MARK MA) 
    时间:2004-12-14 
    声明:此代码你可以无偿使用及转载,但在转载时,请勿移称本文字声明 
    */ 
        SET NOCOUNT ON 
        declare @sqlstr varchar(6000) 
        --处理SQL中危险字符,并且将条件处理成易嵌入的形式 
        set @strwhere=replace(@strwhere,'''','''''') 
        set @strwhere=replace(@strwhere,'--','') 
        set @strwhere=replace(@strwhere,';','') 
        set @sqlstr='declare @CurPageNum int;' 
        set @sqlstr=@sqlstr+'declare @nextpagenum int;' 
        set @sqlstr=@sqlstr+'set @curpagenum='+cast(@PageIndex as varchar)+'*'+cast(@Pagesize as varchar)+';' 
        set @sqlstr=@sqlstr+'set @nextpagenum='+cast(@PageIndex+1 as varchar)+'*'+cast(@Pagesize as varchar)+';' 
        set @sqlstr=@sqlstr+'declare @sqlstr varchar(6000);' 
        if @ordertype=1 
        begin 
        set @sqlstr=@sqlstr+'set @sqlstr=''select '+@fieldlist+' from ( select top ''+cast(@nextpagenum as varchar)+'' * from  
     
    '+@tablename+'  where '+@strwhere+' order by '+@orderfield+' desc ) as a where '+@keyfield+' not in (  
     
    select top ''+cast(@curpagenum as varchar)+'' '+@keyfield+' from '+@tablename+' where '+@strwhere+'  
     
    order by '+@orderfield+' desc) order by '+@orderfield+' desc'';' 
        end 
        else 
        begin 
        set @sqlstr=@sqlstr+'set @sqlstr=''select '+@fieldlist+' from ( select top ''+cast(@nextpagenum as varchar)+'' * from  
     
    '+@tablename+'  where '+@strwhere+' order by '+@orderfield+' asc ) as a where '+@keyfield+' not in (  
     
    select top ''+cast(@curpagenum as varchar)+'' '+@keyfield+' from '+@tablename+' where '+@strwhere+'  
     
    order by '+@orderfield+' asc) order by '+@orderfield+' asc'';' 
        end 
        set @sqlstr=@sqlstr+'execute( @sqlstr)' 
        --print @sqlstr 
        execute(@sqlstr)
    --------------------------------------------------------以上我找来的,好像是csdn的前辈的样子
    但不知道为什么,我觉得好像有点不对的样子.
      

  3.   

    在数据库中实现分页,必须考虑服务器的性能,海量数据尽量不要在数据库中分页,用临时表会增大temp数据库,和I/O操作,尽量做在前端程序中!-----------------------------------------------------------------------那数据库里不分的话,总不见得我把100000条数据放到内存里再给用户罗