做网站的时候,会经常用到分页。如果数据量大的话,肯定要一次从数据库中读取一页的数据,而不是一次全读出来。
分页的思路大概如下,你先把所有需要的数据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