--分页存储过程(联合查询)
create proc sp_Page
@PageIndex int,----当前页索引
@RowCount int,----总记录数
@TableName varchar(500),----表名
@field varchar(500),----字段名
@liketext varchar(500),-----Where条件
@OrderByName varchar(50)-----OrderBy字段
as
declare @sqlText varchar(1000)
set @sqlText =
' select top '+cast(@RowCount as varchar(50))+' * from 
(select top '+cast(@RowCount  as varchar(50))+
'* from (select top ' +cast(@RowCount*@PageIndex as varchar(50))+
@field+' from '+@TableName+' where 1=1 ' +@liketext+ ' order by '+@OrderByName+' desc)TempTable 
 order by '+@OrderByName+ ' )TempTable2  order  by  ' +@OrderByName+' desc' 
exec( @SqlText)
假如现在有5条数据
每页显示3条
那么应该是这样
`
第一条数据
第二条数据
第三条数据
12       第四条数据
第五条数据
12
..
..
..现在使自己写的这个是这样儿了
第一条数据
第二条数据
第三条数据
12  
第三条数据
第四条数据
第五条数据
12
..
它必须得给最后一页填充满了
大侠们帮咱改改呀  T_T

解决方案 »

  1.   

    使用top方式会当然会填充的,
    除非使用between ... and 或者 >= 或者 <=之类的,
    那么就不会填充了.
      

  2.   


    他这个主要是连该top 几都没算,直接就top 当页该显示的记录数了。
    试试我的分页吧,性能还行。
    http://www.dmblogs.com/nzBlog/article.asp?id=25
      

  3.   

    通用存储过程create PROCEDURE [dbo].[test001] 
    @strSql varchar(8000),
    @nPageSize int,
    @nPageCount int
    as
    SET NOCOUNT ON 

    DECLARE @P1 INT
    DECLARE @nRowCount INT 

    --//注意:@scrollopt = 1 会取得Select的时候的总行数
    EXEC sp_cursoropen @P1 OUTPUT, @strSql, @scrollopt = 1, @ccopt = 1, @rowcount = @nRowCount OUTPUT

    IF (@P1 != 0)
    BEGIN
    SELECT @nRowCount AS nRecordCount, ceiling(1.0 * @nRowCount / @nPageSize) AS nPageCount, @nPageCount AS nPage
    SET @nPageCount = (@nPageCount - 1) * @nPageSize + 1 
    EXEC sp_cursorfetch @P1, 32, @nPageCount, @nPageSize 
    EXEC sp_cursorclose @P1
    END在程序中取第二个记录集 set rs=rs.nextrecordset 
      

  4.   


    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
    --SQL提供的存储过程
    exec sp_cursoropen @p1 output,@sqlstr
    exec sp_cursoropen @p1,16,@begincol,@pagesize
    exec sp_cursoropen @p1alter proc roypage
    (@tablename varchar(255),@pagecount int=1,@pagesize int=99999999)
    as
    begin
    set nocount on
    declare @P1 int
    declare @sqlstr nvarchar(4000)
    set @pagecount=(@pagecount-1)*@pagesize+1
    set @sqlstr='select * from '+@tablename
    exec sp_cursoropen @P1 output,@sqlstr
    exec sp_cursoropen @P1,16,@pagecount,@pagesize
    exec sp_cursoropen @P1
    end
    --exec roypage 'product',10,100
    方法2
    create proc roypage1
    (@sqlstr nvarchar(4000),@pagecount int=1,@pagesize int=99999999)
    as
    begin
    set nocount on
    declare @P1 int
    set @pagecount=(@pagecount-1)*@pagesize+1
    exec sp_cursoropen @P1 output,@sqlstr
    exec sp_cursoropen @P1,16,@pagecount,@pagesize
    exec sp_cursoropen @P1
    endexec roypage1 'select * from product ',10,100
      

  5.   

    perfectaction 大哥
    谢谢啦
    真的非常的快 
    o(∩_∩)o...哈哈