日期:2014-05-16 浏览次数:20713 次
CREATE TABLE SalesHistory ( SaleID INT IDENTITY(1,1), Product VARCHAR(30), SaleDate SMALLDATETIME, SalePrice MONEY )
--Row_Number() over分页 alter procedure proPageAccessByRowNumber ( @pageNumber int,--页号 @pageSize int --页面大小 ) as begin set nocount on --关掉返回计数(T—SQL语句所影响的行数) select * from (select ceiling(row_number() over(order by saleid)/(@pageSize*1.0)) as row_number,* from saleshistory) as temptable where row_number=@pageNumber --row_number函数的用途是非常广泛,这个函数的功能是为查询出来的 --每一行记录生成一个序号 --ceiling作用是对数字取整为最接近的整数或最接近的多个有效数字。 0.22~1 --子查询的是产生一张带页号的临时表,然后在根据当前页号来查询。 set nocount off end exec proPageAccessByRowNumber @pageNumber=12, @pageSize=5
--top分页 alter procedure proPageAccessByTop ( @pageIndex int,--页面索引(从0开始) @pageSize int,--页面大小 @recordCount int output,--总记录数 @pageCount int output--总页面数 ) as begin --赋值总记录数 select @recordCount=count(*) from saleshistory --赋值总页面数 set @pageCount=ceiling(@recordCount*1.0/@pageSize) --申明“剩余记录”和sql查询字符串变量 declare @residualRecord int declare @sql nvarchar(1000) --计算剩余记录并赋值 set @residualRecord=@recordCount-@pageIndex*@pageSize --当第一页时,直接一次top语句 if(@pageIndex=0 or @pageCount<=1) begin set @sql=N'select top'+str(@pageSize)+' * from saleshistory' end --当最后一页时,对剩余记录进行查询操作 if(@pageIndex=@pageCount-1) begin set @sql=N'select * from (select top'+str(@residualRecord)+' * from saleshistory order by saleid desc) t order by saleid asc' end --否则,top两次翻转。首先,通过降序排列在整张表中筛选出所有剩余记录,然后在对这些记录进行翻转排序取出前@pageSize条记录。 else begin set @sql=N'select top '+str(@pageSize)+'* from (select top'+str(@residualRecord)+'* from saleshistory order by saleid desc) t order by saleid asc' end end exec(@sql)