比如有一个叫BOOKS的表,里面有上千条记录,我要把书名Title列里包含C++的书全部列出来,并且是按每次10条记录的方式分页显示该怎么写?

解决方案 »

  1.   

    --类似
    select
     top 10 b.* 
    from
     (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b
    where
     b.主键字段 = a.主键字段 
    and
     order by a.排序字段 
      

  2.   

    //-----下面是一个支持任意表的 SQL SERVER2000分页存储过程//----分页存储过程开始创建-----------------------------------------------------------------------------------------------------------
    IF EXISTS (SELECT name FROM sysobjects WHERE name = 'PageShowOne' AND type = 'P')
       DROP PROCEDURE PageShowOne
    GOCREATE Proc PageShowOne
        @PageSize int=10 ,--每页显示的记录数
        @PageCurrent int=1 ,--当前要显示的页号
        @FdName varchar(100)='' ,--主键名或者标识列名
        @SelectStr varchar(2000)='', --select子句,不包含select关键字,如:*或者Id,UserId,UserName等。
        @FromStr varchar(1000)='', --from子句,不包含from关键子,如:myTable或者myTable,yourTable
        @WhereStr varchar(2000)='', --Where子句,不包含where关键字,如空的,或者 id>2 等
        @OrderByStr varchar(1000)='',--order by 子句,不包含order by 子句 ,如id desc,UserId asc 等
        @CountRows int=0 output, --返回记录总数
        @CountPage int=0 output --返回总页数
    as
    --------定义局部变量---------
    declare @Id1 varchar(20),@Id2 varchar(20) --开始和结束的记录号
    declare @OrderBySqls varchar(1000) --order by 子句
    declare @WhereSqls varchar(2000) --where 子句
    declare @Sqls nvarchar(4000) --最终组合成的Sqls语句
    declare @TmpStr varchar(2000) --临时
    ----------------------------
    if @OrderByStr <> ''
        set @OrderBySqls = ' order by '+@OrderByStr
    else
        set @OrderBySqls = ''
    --------
    if @WhereStr <> ''
        set @WhereSqls = ' where ('+@WhereStr+')'
    else
        set @WhereSqls = ''
    --------
    set @TmpStr = @WhereSqls
    --如果显示第一页,可以直接用top来完成
    if @PageCurrent<=1 
    begin
        select @Id1=cast(@PageSize as varchar(20))
        exec('select top '+@Id1+' '+@SelectStr+' from '+@FromStr+@WhereSqls+@OrderBySqls)
        goto LabelRes
    end
    ---------------------------
    select @Id1=cast(@PageSize as varchar(20))
           ,@Id2=cast((@PageCurrent-1)*@PageSize as varchar(20))
    ----------
    if @WhereSqls <> ''
        set @WhereSqls = @WhereSqls + ' and (' + @FdName+' not in(select top '+@Id2+' '+@FdName+' from '+@FromStr+@WhereSqls+@OrderBySqls+'))'
    else
        set @WhereSqls = ' where ' + @FdName+' not in(select top '+@Id2+' '+@FdName+' from '+@FromStr+@WhereSqls+@OrderBySqls+')'
    ----------
    set @Sqls = 'select top '+@Id1+ ' '+ @SelectStr+' from '+@FromStr+@WhereSqls+@OrderBySqls
    exec (@Sqls)
    -----------
    LabelRes:
    -----返回总记录数
    set @Sqls = 'select @a=count(1)  from '+@FromStr+@TmpStr
    exec sp_executesql @sqls,N'@a int output',@CountRows output 
    -----返回总页数
    if @CountRows <= @PageSize
        set @CountPage = 1
    else
    begin
        set @CountPage = @CountRows/@PageSize
        if (@CountRows%@PageSize) > 0
           set @CountPage = @CountPage + 1
    end
    return
    GO
    //----分页存储过程结束---------------------------------------------------------------------------------------
      

  3.   


    --参拷分页Create PROCEDURE [dbo].[UP_QuickSearch]
        @TblName      VARCHAR(255),       -- 表名
        @PrimaryKey   VARCHAR(20),          -- 主键
        @OrderBy      varchar(100),       --排序
        @FldNames     VARCHAR(1000),       -- 要返回的字段
        @IsCount      int ,               --1为计算总计录数 
        @PageSize     INT = 10,           -- 页尺寸
        @PageIndex    INT = 1,            -- 页码
        @strWhere     VARCHAR(8000) = ''  -- 查询条件 (注意: 不要加 where)
    AS
    declare @strSQL   varchar(5000),@order varchar(50)if @OrderBy != ''
        set @order=' order by '+@OrderBy
    else 
        set @order=' order by '+@PrimaryKey +' desc '
    if @strWhere !=''
    set @strWhere=' where '+@strWhere
    if @IsCount<>1
    set @strSQL='SELECT * FROM (SELECT ROW_NUMBER() OVER ('+@order+') AS RowNumber,'+@FldNames+' FROM ['+@TblName+']'+@strWhere+') AS tempT WHERE RowNumber BETWEEN '+str((@PageIndex-1)*@PageSize+1)+' AND '+str(@PageIndex*@PageSize)
    else
    set @strSQL='select count(0) as Total from ['+@TblName+']'+@strWhere
    exec (@strSQL)
    GOSelect * FROM ( 
        select ROW_NUMBER() Over(order by 排序字段 desc) as rowId,* from 数据表 

    where rowId between 页面大小*(页号-1) and 页面大小*页号
    set ANSI_NULLS ON 
    set QUOTED_IDENTIFIER ON 
    go 
    -- ============================================= 
    -- Description:    <高效分页存储过程,仅适用于Sql2005> 
    -- Notes:        <排序字段强烈建议建索引> 
    -- Page2005 'dyj_vclient','client_id,last_dt','client_id','last_dt','desc','',20,1,0 
    -- ============================================= 
    ALTER Procedure [dbo].[Page2005] 
    @TableName varchar(50),          --表名 
    @Fields varchar(5000) = '*',      --字段名(全部字段为*) 
    @PrimaryKey varchar(20),          --主键 
    @OrderField varchar(5000),        --排序字段(必须!支持多字段) 
    @Orderby varchar(8)='desc',      --排序方式(desc:倒序,asc:顺序) 
    @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 isnull(@PrimaryKey,'')='' 
          set @PrimaryKey='*' 
        --计算总记录数 
            
        if (@SqlWhere='' or @sqlWhere=NULL) 
            set @sql = 'select @totalRecord = count('+ @PrimaryKey +') from ' + @TableName 
        else 
            set @sql = 'select @totalRecord = count('+ @PrimaryKey +') from ' + @TableName + ' 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 + ' '+ @Orderby +') as rowId,' + @Fields + ' from ' + @TableName 
        else 
            set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ' '+ @Orderby +') as rowId,' + @Fields + ' from ' + @TableName + ' 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 ' + @TableName + ' where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' +  Convert(varchar(50),@EndRecord) 
        
        Exec(@Sql) 
        --------------------------------------------------- 
        If @@Error <> 0 
          Begin 
            RollBack Tran 
            Return -1 
          End 
        Else 
          Begin 
            Commit Tran 
            Return @totalRecord ---返回记录总数 
          End    
    end
      

  4.   

    SELECT * FROM BOOKS WHERE TITLE LIKE '%C++%'分页话,上面有了,