time 
设为首页】【收藏本站
当前位置: 主页 > 数据库 > SQL Server > SQL 基础 > 最精简的分页处理方式

最精简的分页处理方式

时间:2010-04-13 01:07 点击:629次 字体:[ ]




你一定见过这样的SQL语句

 

 

select top 5 * from (select top 15 * from tableNameorder by id asc) tableName order by id desc

 

 

或者类似用select top 方式的分页储存过程

 

 

SQL Server2005 中row_number函数的诞生,在处理分页上简化了很多语句

 

 

row_number函数的用途是非常广泛,这个函数的功能是为查询出来的每一行记录生成一个序号。row_number函数的用法如下面的SQL语句所示:

 

 

没有使用row_number函数

 

SELECT * FROM tableName

 

 

最精简的分页处理方式_www.fengfly.com

 

 

使用row_number函数

 

 

 

select row_number() over(order by id) as row_number,* from tableName

 

最精简的分页处理方式_www.fengfly.com

 

 

其中row_number列是由row_number函数生成的序号列。在使用row_number函数是要使用over子句选择对某一列进行排序,然后才能生成序号。

 

 

使用row_number 函数返回2—4条记录

 

 

 

 

with tableName_row
as
(
select row_number() over(order by id) as row_number,* from tableName
)
select * from tableName_row where row_number>1 and row_number < 5 order by id

 

下面是一个分页的存储过程使用row_number 函数

 

 

 

alter PROCEDURE [dbo].[p_ExecPagedBySqlCmd]
(
@from_where nvarchar(2000),--传入的查询条件(from tableName where id=1)
@returncols nvarchar(1000),--需要返回的字段名称
@pageorder varchar(200),  --排序的字段 ex name desc'
@PageIndex int,           --页码
@PageSize int=20,         --每页的数量
@returntotalsize bit=1    --是否返回记录的总数
)
AS
BEGIN

   
SET NOCOUNTON;
   
declare @dysql nvarchar(4000)
   
declare @totalsize as int
   
   
begin
       
if @returntotalsize=1
       
BEGIN
           
set @dysql='select @totalsize=count(1)'+@from_where
           
set @dysql=@dysql+';select @totalsize as totalsize,* from (select ROW_NUMBER() OVER(ORDER BY'
                               
+ @pageorder + ') AS rownum,' + @returncols ++' '+@from_where
                               
+ ' ) as tb where rownum BETWEEN (@PageIndex-1)*@PageSize+1 AND @PageIndex*@PageSize order by' + @pageorder
               
       
END
       
ELSE
       
BEGIN
           
set @dysql='select * from (select ROW_NUMBER() OVER(ORDER BY'
                               
+ @pageorder + ') AS rownum,' + @returncols ++' '+@from_where
                               
+ ' ) as tb where rownum BETWEEN (@PageIndex-1)*@PageSize+1 AND @PageIndex*@PageSize order by' + @pageorder
       
END
       
execute sp_executesql@dysql,N'@totalsize int,@PageIndex int,@PageSize int',@totalsize,@PageIndex,@PageSize
       
       
return
   
end

END

 

 

 

 

 

 

 

 欢迎大家指导!



本文地址 : http://www.fengfly.com/plus/view-173209-1.html
标签: SQL Sever 分页处理
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: