做网站的时候,会经常用到分页。如果数据量大的话,肯定要一次从数据库中读取一页的数据,而不是一次全读出来。


分页的思路大概如下,你先把所有需要的数据Select出来,然后每次去若干条。怎么才能做到每次取若干条呢,首先,你需要把所有的列都加上一个唯一的标识位,以表示出来某一列在结果集中的索引。其次,你需要告诉存储过程,你需要从第几条数据开始取,取多少条。第二个问题好解决,就是给存储过程两个参数,下面主要说说第一个问题,怎样才能加上一列字段,唯一标识出来该列在结果集中的索引呢?
 
下面是我实现的两种方式。
 

第一,适用于所有SQL Server版本,临时表机制。
 
这是我列出来的一些SQL,我知道大家都不太喜欢看别人的代码,因为不知道字段啥意思,也没见到表结构,等等。
我只是象征性的列出来,你忍受一下,看看思路。
creat proc [dbo].[GetPagedData]
@userID varchar(50),
@startIndex int ,
@recordsCount int 
as 
select  lic.goodsID , bag.bagName goodsName , bag.intro ,
lic.isEnable , purchaseMan , rowIndex = identity(int , 1 ,1)          --加上标识列
into #t                                                                                                --插入到临时表中
from goods_licences lic
left join goods_bag bag 
on bag.bagID= lic.goodsID
where lic.licenseeman=@userID
select top(@recordsCount) * from #t where rowIndex >= @startIndex                                                                  
drop table #t                                                                      --从临时表中读数据,完了之后,把临时表删除
 
 
第二种方式,使用 Row_Number() 函数,但要求SQL Server 的版本在2005及其跟高版本。
 
select * from
(
select row_number() OVER( ORDER BY r_user.userID ) as row_index  --加上标识咧
  ,userID
  from r_user
T where row_index between 10 and 20