谁能帮忙写个数据库表分页的案例!

解决方案 »

  1.   

    --功能概述:通用分页存储过程
    --*通用分页存储过程*/ 
     
    IF EXISTS(SELECT * FROM sys.objects WHERE NAME='cndoup_GetPageOfRecords') 
    DROP PROCEDURE cndoup_GetPageOfRecords 
    GO 
    --创建存储过程 
    CREATE PROCEDURE cndoup_GetPageOfRecords 
    @pageSize int = 20,                        --分页大小 
    @currentPage int ,                        --第几页 
    @columns varchar(1000) = '*',              --需要得到的字段 
    @tableName varchar(100),                  --需要查询的表  
    @condition varchar(1000) = '',            --查询条件, 不用加where关键字 
    @ascColumn varchar(100) = '',              --排序的字段名 (即 order by column asc/desc) 
    @bitOrderType bit = 0,                    --排序的类型 (0为升序,1为降序) 
    @pkColumn varchar(50) = ''                --主键名称 AS 
    BEGIN                                          --存储过程开始 
    DECLARE @strTemp varchar(300) 
    DECLARE @strSql varchar(5000)              --该存储过程最后执行的语句 
    DECLARE @strOrderType varchar(1000)        --排序类型语句 (order by column asc或者order by column desc)  BEGIN 
    IF @bitOrderType = 1     --降序 
    BEGIN 
    SET @strOrderType = ' ORDER BY '+@ascColumn+' DESC' 
    SET @strTemp = ' <(SELECT min' 
    END 
    ELSE --升序 
    BEGIN 
    SET @strOrderType = ' ORDER BY '+@ascColumn+' ASC' 
    SET @strTemp = '>(SELECT max' 
    END  IF @currentPage = 1 --第一页 
    BEGIN 
    IF @condition != '' 
    SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+ 
    ' WHERE '+@condition+@strOrderType 
    ELSE 
    SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+@strOrderType 
    END  ELSE -- 其他页 
    BEGIN 
    IF @condition !='' 
    SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+ 
    ' WHERE '+@condition+' AND '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currentPage-1)*@pageSize)+ 
    ' '+@pkColumn+' FROM '+@tableName+@strOrderType+') AS TabTemp)'+@strOrderType 
    ELSE 
    SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+ 
    ' WHERE '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currentPage-1)*@pageSize)+' '+@pkColumn+ 
    ' FROM '+@tableName+@strOrderType+') AS TabTemp)'+@strOrderType 
    END 
    END EXEC (@strSql) END 
      

  2.   


    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GOCREATE proc [dbo].[up_Page2005] 
     @TableName varchar(50),        --表名
     @Fields varchar(5000) = '*',    --字段名(全部字段为*)
     @OrderField varchar(5000),        --排序字段(必须!支持多字段)
     @sqlWhere varchar(5000) = Null,--条件语句(不用加where)
     @pageSize int,                    --每页多少条记录
     @pageIndex int = 1 ,            --指定当前为第几页
     @TotalPage int output            --返回总页数 
    as
    begin    Begin Tran --开始事务    Declare @sql nvarchar(4000);
        Declare @totalRecord int;        --计算总记录数
             
        if (@SqlWhere='' or @sqlWhere=NULL)
            set @sql = 'select @totalRecord = count(*) from ' + @TableName
        else
            set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' with(nolock) where ' + @sqlWhere    EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数        
        
        --计算总页数
        select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)    if (@SqlWhere='' or @sqlWhere=NULL)
            set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName 
        else
            set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName + ' with(nolock) where ' + @SqlWhere    
                --处理页数超出范围情况
        if @PageIndex<=0 
            Set @pageIndex = 1
        
        if @pageIndex>@TotalPage
            Set @pageIndex = @TotalPage     --处理开始点和结束点
        Declare @StartRecord int
        Declare @EndRecord int
        
        set @StartRecord = (@pageIndex-1)*@PageSize + 1
        set @EndRecord = @StartRecord + @pageSize - 1    --继续合成sql语句
        set @Sql = @Sql + ') as t where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' +  Convert(varchar(50),@EndRecord)
         print @sql   
        Exec(@Sql)
        ---------------------------------------------------
        If @@Error <> 0
          Begin
            RollBack Tran
            Return -1
          End
         Else
          Begin
            Commit Tran
            Return @totalRecord ---返回记录总数
          End    
    end/****** 对象:  StoredProcedure [dbo].[up_Page2005V2]    脚本日期: 05/21/2008 11:27:15 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:        <Author,,Name>
    -- Create date: <Create Date,,>
    -- Description:    <Description,,>
    -- =============================================
    CREATE PROCEDURE [dbo].[up_Page2005V2] 
        @TableName varchar(50),        --表名
     @Fields varchar(5000) = '*',    --字段名(全部字段为*)
     @OrderField varchar(5000),        --排序字段(必须!支持多字段)
     @sqlWhere varchar(5000) = Null,--条件语句(不用加where)
     @pageSize int,                    --每页多少条记录
     @pageIndex int = 1 ,            --指定当前为第几页
     @totalRecord int = 0,
     @TotalPage int output            --返回总页数
    AS
    BEGIN
        
         Begin Tran --开始事务    Declare @sql nvarchar(4000);     if @totalRecord<=0 begin
            --计算总记录数
                 
            if (@SqlWhere='' or @sqlWhere=NULL)
                set @sql = 'select @totalRecord = count(*) from ' + @TableName
            else
                set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' with(nolock) where ' + @sqlWhere        EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数       
        end    --计算总页数
        select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)    if (@SqlWhere='' or @sqlWhere=NULL)
            set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName 
        else
            set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName + ' with(nolock) where ' + @SqlWhere    
                --处理页数超出范围情况
        if @PageIndex<=0 
            Set @pageIndex = 1
        
        if @pageIndex>@TotalPage
            Set @pageIndex = @TotalPage     --处理开始点和结束点
        Declare @StartRecord int
        Declare @EndRecord int
        
        set @StartRecord = (@pageIndex-1)*@PageSize + 1
        set @EndRecord = @StartRecord + @pageSize - 1    --继续合成sql语句
        set @Sql = @Sql + ') as t where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' +  Convert(varchar(50),@EndRecord)
         print @sql   
        Exec(@Sql)
        ---------------------------------------------------
        If @@Error <> 0
          Begin
            RollBack Tran
            Return -1
          End
         Else
          Begin
            Commit Tran
            Return @totalRecord ---返回记录总数
          End   
    END
    GO
      

  3.   

    2000:
    USE [game]
    GO
    /****** 对象:  StoredProcedure [dbo].[page]    脚本日期: 05/21/2008 11:37:12 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GOCREATE proc [dbo].[page]
    @RecordCount int output,
    @ReturnCount bit,
    @QueryStr nvarchar(1000)='table1',--表名、视图名、查询语句
    @PageSize int=20,  --每页的大小(行数)
    @PageCurrent int=2,  --要显示的页 从0开始
    @FdShow nvarchar (2000)='*', --要显示的字段列表
    @IdentityStr nvarchar (100)='id', --主键
    @WhereStr nvarchar (2000)='1=1',
    @FdOrder nvarchar(100)='desc' --排序    只能取desc或者asc
    asset nocount ondeclare@sql nvarchar(2000)
    if @WhereStr = '' begin
     set @WhereStr = '1=1'
    endif @ReturnCount=1 begin
     declare @tsql nvarchar(200)
     set @tsql=N'select @RecordCount = count(*) from ' + @QueryStr + ' where ' + @WhereStr
     exec sp_executesql @tsql,N'@RecordCount int output',@RecordCount output
    endif @PageCurrent = 0 begin
     set @sql = 'select top ' + cast(@PageSize as nvarchar(3)) + ' ' + @FdShow + ' from ' + @QueryStr + ' where ' + @WhereStr + ' order by ' + @IdentityStr + ' ' + @FdOrder
    endelse begin
     if upper(@FdOrder) = 'DESC' begin
      set @sql = 'select top ' + cast(@PageSize as nvarchar(3)) + ' ' + @FdShow + ' from ' + @QueryStr + ' where ' + @WhereStr + ' and ' + @IdentityStr + '< ( select min(' + @IdentityStr + ') from (select top ' + cast(@PageSize*@PageCurrent as nvarchar(10)) + ' ' + @IdentityStr + ' from ' + @QueryStr + ' where ' + @WhereStr + ' order by ' + @IdentityStr + ' desc) as t) order by ' + @IdentityStr + ' desc'
     end
     else begin
      set @sql = 'select top ' + cast(@PageSize as nvarchar(3)) + ' ' + @FdShow + ' from ' + @QueryStr + ' where ' + @WhereStr + ' and ' + @IdentityStr + '> ( select max(' + @IdentityStr + ') from (select top ' + cast(@PageSize*@PageCurrent as nvarchar(10)) + ' ' + @IdentityStr + ' from ' + @QueryStr + ' where ' + @WhereStr + ' order by ' + @IdentityStr + ' asc) as t) order by ' + @IdentityStr + ' asc'
     end
    end
    --print @sql
    execute(@sql)
      

  4.   

    --方法1:
    --适用于 SQL Server 2000/2005
    SELECT TOP 页大小 *
    FROM table1
    WHERE id NOT IN
              (
              SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
              )
    ORDER BY id
    --方法2:
    --适用于 SQL Server 2000/2005
    SELECT TOP 页大小 *
    FROM table1
    WHERE id >
              (
              SELECT ISNULL(MAX(id),0) 
              FROM 
                    (
                    SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
                    ) A
              )
    ORDER BY id
    --方法3:
    --适用于 SQL Server 2005
    SELECT TOP 页大小 * 
    FROM 
            (
            SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1
            ) A
    WHERE RowNumber > 页大小*(页数-1)
      

  5.   

    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    goALTER PROCEDURE [sq_zhao].[mypager]
    /*
    ***************************************************************
    ** 千万数量级分页存储过程 **
    ***************************************************************
    参数说明:
    1.Tables :表名称,视图
    2.PrimaryKey :主关键字
    3.Sort :排序语句,不带Order By 比如:NewsID Desc,OrderRows Asc
    4.CurrentPage :当前页码
    5.PageSize :分页尺寸
    6.Filter :过滤语句,不带Where 
    7.Group :Group语句,不带Group By
    效果演示:http://www.cn5135.com/_App/Enterprise/QueryResult.aspx
    ***************************************************************/
    (
    @Tables varchar(1000),
    @PrimaryKey varchar(100),
    @Sort varchar(200) = NULL,
    @CurrentPage int = 1,
    @PageSize int = 10,
    @Fields varchar(1000) = '*',
    @Filter varchar(1000) = NULL,
    @Group varchar(1000) = NULL,
    @RecordCount int OUTPUT 
    )
    AS
    /*默认排序*/
    IF @Sort IS NULL OR @Sort = ''
    SET @Sort = @PrimaryKey
    DECLARE @SortTable varchar(100)
    DECLARE @SortName varchar(100)
    DECLARE @strSortColumn varchar(200)
    DECLARE @operator char(2)
    DECLARE @type varchar(100)
    DECLARE @prec int
    declare @str NVarchar(600) /*设定排序语句.*/
    IF CHARINDEX('DESC',@Sort)>0
    BEGIN
    SET @strSortColumn = REPLACE(@Sort, 'DESC', '')
    SET @operator = '<='
    END
    ELSE
    BEGIN
    IF CHARINDEX('ASC', @Sort) = 0
    SET @strSortColumn = REPLACE(@Sort, 'ASC', '')
    SET @operator = '>='
    END
    IF CHARINDEX('.', @strSortColumn) > 0
    BEGIN
    SET @SortTable = SUBSTRING(@strSortColumn, 0, CHARINDEX('.',@strSortColumn))
    SET @SortName = SUBSTRING(@strSortColumn, CHARINDEX('.',@strSortColumn) + 1, LEN(@strSortColumn))
    END
    ELSE
    BEGIN
    SET @SortTable = @Tables
    SET @SortName = @strSortColumn
    END
    SELECT @type=t.name, @prec=c.prec
    FROM sysobjects o 
    JOIN syscolumns c on o.id=c.id
    JOIN systypes t on c.xusertype=t.xusertype
    WHERE o.name = @SortTable AND c.name = @SortName
    IF CHARINDEX('char', @type) > 0
    SET @type = @type + '(' + CAST(@prec AS varchar) + ')'
    DECLARE @strPageSize varchar(50)
    DECLARE @strStartRow varchar(50)
    DECLARE @strFilter varchar(1000)
    DECLARE @strSimpleFilter varchar(1000)
    DECLARE @strGroup varchar(1000)
    /*默认当前页*/
    IF @CurrentPage < 1
    SET @CurrentPage = 1
    /*设置分页参数.*/
    SET @strPageSize = CAST(@PageSize AS varchar(50))
    SET @strStartRow = CAST(((@CurrentPage - 1)*@PageSize + 1) AS varchar(50))
    /*筛选以及分组语句.*/
    IF @Filter IS NOT NULL AND @Filter != ''
    BEGIN
    SET @strFilter = ' WHERE ' + @Filter + ' '
    SET @strSimpleFilter = ' AND ' + @Filter + ' '
    END
    ELSE
    BEGIN
    SET @strSimpleFilter = ''
    SET @strFilter = ''
    END
    IF @Group IS NOT NULL AND @Group != ''
    SET @strGroup = ' GROUP BY ' + @Group + ' '
    ELSE
    SET @strGroup = ''
    /*执行查询语句*/select @str=N'select @recordcount=count(*) from '+@Tables+ @strFilter
    Execute sp_executesql @str,N'@recordcount int OUTPUT',@recordcount=@recordcount OUTPUTEXEC(
    '
    DECLARE @SortColumn ' + @type + '
    SET ROWCOUNT ' + @strStartRow + '
    SELECT @SortColumn=' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
    SET ROWCOUNT ' + @strPageSize + '
    SELECT ' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strSortColumn + @operator + ' @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
    '
    )
      

  6.   

    例如这张表怎么分, select spbh ,spmc spda from spda
      

  7.   

    http://topic.csdn.net/u/20081025/21/e550a404-9351-426b-a5f6-26e588387c2c.html
      

  8.   

    http://www.crazycoder.cn/Tag/5139/Index.html
      

  9.   

    --取第100条到第200条记录:
    --2005
    select * from 
    (
        select *,rowid=row_number() over(order by spbh)
        from tb
    ) t
    where rowid between 100 and 200--2000
    select top 100 * from tb
    where spbh not in(select top 100 spbh from tb order by spbh)
    order by spbh