大家好。请问你们做数据分页的时候是怎么写的,下面是我测试用的一个存储过程,
create proc Proc_GetReply
@PostID varchar(36),
@Ps int,
@Pn int
as 
declare @sql nvarchar(2000)
set @sql='with c as (select p.id,p.[Content],p.RPLTime,u.userid,u.img,u.score,u.weiwang,u.style,u.alltime from post_reply as p,[user] as u where p.userid=u.id and postid=''' + @PostID +''')'
set @sql=@sql +' select top ' + convert(varchar,@Ps)+ ' * from c where id not in (select top ' + convert(varchar,(@Pn-1)*@Ps)+ ' id from c order by rpltime) order by rpltime'
exec(@sql)
go
我的思路是传PN和PS进去,查询得到要的数据,然后另外输出或返回所有总的行数,在程序里把行数赋值给一个控件,让它生成页码。这样做合适吗?上面写的有点乱。加上本人的SQL不行,具体就是先二表查询得出所有的数据放到一个表(c)里,再对C表进行处理,然后返回C表的行数(现在不知道怎么返回了)。
我里面是用的Not IN方法的,还有一种方法是给整个表排序,再根据页码条件反过来排。
如:
select * from (select top 3 * from (select 3 id from tab order by id asc) as a order by id desc) as b order by id asc第二种当数据多的时候速度才体现出来。
我只知道这两种,你们一般写的时候用什么方法分页的?
还有,用.NET分页控件性能怎么样?

解决方案 »

  1.   

    数据库应该是2005的吧,
    可以使用row_number函数
    create proc Proc_GetReply
        @PostID varchar(36),
        @Ps int,
        @Pn int
    as 
        declare @sql nvarchar(2000)
        
        set @sql='with c as (select rowid=row_number()over(order by p.RPLTime asc),p.id,p.[Content],p.RPLTime,u.userid,u.img,u.score,u.weiwang,u.style,u.alltime from post_reply as p,[user] as u where p.userid=u.id and postid=''' + @PostID +''')'
        set @sql=@sql +' select  * from c where rowid between ' + convert(varchar,(@Pn-1)*@Ps)+ ' and '+convert(varchar,(@Pn-1)*@Ps)+' order by rpltime'
        exec(@sql)
    go
      

  2.   

    http://blog.csdn.net/xys_777/archive/2010/06/20/5680855.aspx
    仅参考