网上提供的分页的存储过程的排序字段都是要有序的不重复的值的字段才行,有没有哪位有解决如题的方法

解决方案 »

  1.   

    网上也有根据row_number取得行号,再分页的
    但是需要sql2005以上
      

  2.   

    http://topic.csdn.net/u/20100617/04/80d1bd99-2e1c-4083-ad87-72bf706cb536.html?15304
      

  3.   

    项目开发已进行了一介段了,用了sql2000 因为其它同事也在开发,不可能换数据库
      

  4.   

    --(原代码作者:邹建)
    create Proc p_show
    @QueryStr nvarchar(4000), --表名、视图名、查询语句,如要加条件,直接在此加入(如:select * from tb where ....)
    @PageSize int=10,   --每页的大小(行数)
    @pagecount int out, --显示总页数
    @PageCurrent int=1,   --要显示的页
    @FdShow nvarchar (4000)='',--要显示的字段列表,如果查询结果有标识字段,需要指定此值,且不包含标识字段
    @FdOrder nvarchar (1000)='' --排序字段列表
    as
    declare @FdName nvarchar(250) --表中的主键或表、临时表中的标识列名
     ,@Id1 varchar(20),@Id2 varchar(20) --开始和结束的记录号
     ,@Obj_ID int    --对象ID
     ,@sql nvarchar(4000)
    --表中有复合主键的处理
    declare @strfd nvarchar(2000) --复合主键列表
     ,@strjoin nvarchar(4000) --连接字段
     ,@strwhere nvarchar(2000) --查询条件
    select @Obj_ID=object_id(@QueryStr)
     ,@FdShow=case isnull(@FdShow,'') when '' then ' *' else ' '+@FdShow end
     ,@FdOrder=case isnull(@FdOrder,'') when '' then '' else ' order by '+@FdOrder end
     ,@QueryStr=case when @Obj_ID is not null then ' '+@QueryStr else ' ('+@QueryStr+') a' end
     
    --显示总页数
     
    set @sql='select @pagecount=ceiling(count(*)*1./@PageSize) from '+@QueryStr
    exec sp_executesql @sql,N'@pagecount int out,@PageSize int',@pagecount out,@PageSize--如果显示第一页,可以直接用top来完成
    if @PageCurrent=1 
    begin
     select @Id1=cast(@PageSize as varchar(20))
     exec('select top '+@Id1+@FdShow+' from '+@QueryStr+@FdOrder)
     return
    end--如果是表,则检查表中是否有标识更或主键
    if @Obj_ID is not null and objectproperty(@Obj_ID,'IsTable')=1
    begin
     select @Id1=cast(@PageSize as varchar(20))
      ,@Id2=cast((@PageCurrent-1)*@PageSize as varchar(20)) select @FdName=name from syscolumns where id=@Obj_ID and status=0x80
     if @@rowcount=0   --如果表中无标识列,则检查表中是否有主键
     begin
      if not exists(select 1 from sysobjects where parent_obj=@Obj_ID and xtype='PK')
       goto lbusetemp  --如果表中无主键,则用临时表处理  select @FdName=name from syscolumns where id=@Obj_ID and colid in(
       select colid from sysindexkeys where @Obj_ID=id and indid in(
        select indid from sysindexes where @Obj_ID=id and name in(
         select name from sysobjects where xtype='PK' and parent_obj=@Obj_ID
       )))
      if @@rowcount>1  --检查表中的主键是否为复合主键
      begin
       select @strfd='',@strjoin='',@strwhere=''
       select @strfd=@strfd+',['+name+']'
        ,@strjoin=@strjoin+' and a.['+name+']=b.['+name+']'
        ,@strwhere=@strwhere+' and b.['+name+'] is null'
        from syscolumns where id=@Obj_ID and colid in(
        select colid from sysindexkeys where @Obj_ID=id and indid in(
         select indid from sysindexes where @Obj_ID=id and name in(
          select name from sysobjects where xtype='PK' and parent_obj=@Obj_ID
        )))
       select @strfd=substring(@strfd,2,2000)
        ,@strjoin=substring(@strjoin,5,4000)
        ,@strwhere=substring(@strwhere,5,4000)
       goto lbusepk
      end
     end
    end
    else
     goto lbusetemp/*--使用标识列或主键为单一字段的处理方法--*/
    lbuseidentity: 
     exec('select top '+@Id1+@FdShow+' from '+@QueryStr
      +' where '+@FdName+' not in(select top '
      +@Id2+' '+@FdName+' from '+@QueryStr+@FdOrder
      +')'+@FdOrder
      )
     return/*--表中有复合主键的处理方法--*/
    lbusepk:  
     exec('select '+@FdShow+' from(select top '+@Id1+' a.* from
      (select top 100 percent * from '+@QueryStr+@FdOrder+') a
      left join (select top '+@Id2+' '+@strfd+' 
      from '+@QueryStr+@FdOrder+') b on '+@strjoin+'
      where '+@strwhere+') a'
      )
     return/*--用临时表处理的方法--*/
    lbusetemp:  
    select @FdName='[ID_'+cast(newid() as varchar(40))+']'
     ,@Id1=cast(@PageSize*(@PageCurrent-1) as varchar(20))
     ,@Id2=cast(@PageSize*@PageCurrent-1 as varchar(20))exec('select '+@FdName+'=identity(int,0,1),'+@FdShow+'
      into #tb from'+@QueryStr+@FdOrder+'
     select '+@FdShow+' from #tb where '+@FdName+' between '
     +@Id1+' and '+@Id2
     )
    GO
      

  5.   

    --调用示例:
    declare @pagecount int
    exec p_show 
    @QueryStr='select id,name from syscolumns',
    @PageSize=20,
    @pagecount=@pagecount out,
    @PageCurrent=2,
    @FdOrder='id'--ID为有重复值的字段
    select @pagecount AS 页数  
    /*
    ID_84F29D9B-9ECB-49F3-8AAE-85796BDA8B60 id          name
    --------------------------------------- ----------- --------------------------------------------------------------------------------------------------------------------------------
    20                                      5           fgidfs
    21                                      5           rcrows
    22                                      5           cmprlevel
    23                                      5           fillfact
    24                                      5           maxnullbit
    25                                      5           maxleaf
    26                                      5           maxint
    27                                      5           minleaf
    28                                      5           minint
    29                                      5           rsguid
    30                                      5           lockres
    31                                      5           dbfragid
    32                                      7           auid
    33                                      7           type
    34                                      7           ownerid
    35                                      7           status
    36                                      7           fgid
    37                                      7           pgfirst
    38                                      7           pgroot
    39                                      7           pgfirstiam(20 行受影响)页数
    -----------
    60(1 行受影响)
    */
      

  6.   

    两个字段排序后分页
    http://blog.csdn.net/xys_777/archive/2010/07/18/5743732.aspx
      

  7.   

    7楼你好,
    declare @pagecount int
    exec byp_show 
        @QueryStr='select customerid,orderdate,orderid  from orders',
        @PageSize=20,
        @pagecount=@pagecount out,
        @PageCurrent=2,
        @FdOrder='orderdate'--ID为有重复值的字段
    select @pagecount AS 页数  出错:
    服务器: 消息 8108,级别 16,状态 1,行 1
    无法使用 SELECT INTO 语句向表 '#tb' 中添加标识列,该表中已有继承了标识属性的列 'orderid'。