现在我有一张表,纪录ID是标识,增量为1,由SQL SERVER自增填入,我现在要分页查询这个表,譬如一页数据为100条,我要通过页号来查询数据库中的记录,我该如何来写SQL语句或者写存储过程?

解决方案 »

  1.   

    csdn里面有很多吧!!要不你查询一下看看
      

  2.   

    通过row_number() 排序
    然后取 top m 到 n
      

  3.   

    以下代码,假设每页100,查出第3页的
    declare @PageNo int
    declare @PageSize int
    set @PageNo=3
    set @PageSize=100
    select * from tb where id between (@pageno-1)*@PageSize+1 and @pageno*@PageSize
      

  4.   

    首先对于上面的id由于用户可以删除单条的纪录所以id值大小未知,并且id值可能不连续,因此通过id来限定查询范围的方式有些说不通
      

  5.   

    分页 - sql server 2000 http://blog.csdn.net/xys_777/archive/2010/06/20/5681828.aspx
      

  6.   

    SQL2000 不支持row_number() 方式,建议搜一下邹健(老大)的处理方式。
      

  7.   

    http://www.360doc.com/content/06/0830/14/2224_194306.shtml参考二
      

  8.   

    if object_id('tb') is not null drop table tb
    create table tb
    (
      Col int
    )
    insert into tb select top 50 number from master..spt_values where type='P' and number>0create proc SplitPage
    (
      @TableName nvarchar(50),
      @PageSize int,--每页显示的数量
      @CurrentPage int,--当前第几页
      @PageCol nvarchar(50),--排序字段
      @OrderNo nvarchar(50)--排序方式(DESC,ASC)
    )
    as
    /*
    测试用的
    declare @PageCol nvarchar(50)
    declare @TableName nvarchar(50)
    declare @OrderNo nvarchar(50)
    declare @PageSize int
    declare @CurrentPage int
    set @PageCol='Col'
    set @TableName='tb'
    set @OrderNo='DESC'
    set @PageSize=10
    set @CurrentPage=4
    */
    declare @sql nvarchar(1000)
    set @sql=''
    set @sql='
    ;with hgo as
    (
      select *,row_number() over(
      order by '+@PageCol+' '+@OrderNo+') rank
      from '+@TableName+'
    )'
    set @sql=@sql+'select Col from hgo where rank between '+ltrim((@CurrentPage-1)*@PageSize+1)+' and '+ltrim(@CurrentPage*@PageSize)
    --print @sql
    exec (@sql)exec SplitPage 'tb',10,1,'Col','DESC'Col
    -----------
    50
    49
    48
    47
    46
    45
    44
    43
    42
    41(10 行受影响)exec SplitPage 'tb',10,3,'Col','DESC'
    Col
    -----------
    30
    29
    28
    27
    26
    25
    24
    23
    22
    21(10 行受影响)
      

  9.   

    http://blog.csdn.net/htl258/archive/2009/04/24/4115766.aspx
      

  10.   

    CREATE PROCEDURE P_Page
    (
     @pageNo INT=1,
     @pageSize INT=10
    )
    AS
    DECLARE @s NVARCHAR(2000)
    SET @s='SELECT top '+RTRIM(@pageSize)+'* FROM enterprise WHERE ID not in(select top '+RTRIM((@pageNo-1)*@pageSize)+'  from enterprise)'
    EXEC (@s)
    go
    可用存储过程,如以上ID为表唯一列时可调用
    SQL2000可用邹建写法,最高效的写法还是针对性的写
    楼主换SQL2005以上版本可用row_Number实现更简单/*--用存储过程实现的分页程序 显示指定表、视图、查询结果的第X页
     对于表中主键或标识列的情况,直接从原表取数查询,其它情况使用临时表的方法
     如果视图或查询结果中有主键,不推荐此方法--邹建 2003.09(引用请保留此信息)--*//*--调用示例
     exec p_show '地区资料' exec p_show '地区资料',5,3,'地区编号,地区名称,助记码','地区编号'
    --*/if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_show]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[p_show]
    GOCREATE Proc p_show
    @QueryStr nvarchar(4000), --表名、视图名、查询语句
    @PageSize int=10,   --每页的大小(行数)
    @PageCurrent int=1,   --要显示的页
    @FdShow nvarchar (4000)='', --要显示的字段列表,如果查询结果有标识字段,需要指定此值,且不包含标识字段
    @FdOrder nvarchar (1000)='' --排序字段列表
    as
    declare @FdName nvarchar(250) --表中的主键或表、临时表中的标识列名
     ,@Id1 varchar(20),@Id2 varchar(20) --开始和结束的记录号
     ,@Obj_ID int    --对象ID
    --表中有复合主键的处理
    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--如果显示第一页,可以直接用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 
      

  11.   

    楼主要根据你使用的sqlserver版本来做决定
    如果是2000,必须要用select top 的方法来做
    存储过程传入页号,页大小,
    然后组装语句,转换成select top xxx from tab的方式如果是2005以上的,可以直接用row_number()函数,更方便