当某个Web区域中需要列出大量商品,通常有效的做法是让访问者分页浏览,每页预先确定显示的商品数量。
根据在架构的哪一层上执行分页来划分,主要有两种实现方法:
(1)在数据层分页:采用这种方法,数据库只返回访问者想要查看的那一页商品。
(2)在表示层分页:这种方法,数据层返回的是所需的所有商品列表,有表示层对象(如GridView)从这个完整的商品列表中获取所需的商品页。用这种方法处理结果集较大的应用时,有潜在的性能问题,因为它从数据库中向表示层传达了大量不需要的数据。
这里介绍使用SQL Server 2005的Row_NUMBER函数,来实现该功能。
Row_NUMBER函数将针对select语句返回的每一行,从1开始编号,赋予其连续的编号。需要专门指定一列用于预先排序以便于进行编号,这样查询的结果才能避免重复。
例:
1.从Product表中,按照ProductID的顺序,列出Name
select ROW_NUMBER() OVER (order by ProductID) as Row, Name
结果是行号和产品名
2.取出商品列表中的第6-10个
select Row,Name
from(select ROW_NUMBER() OVER (order by ProductID) as Row,Name
from Product
)as ProductsWithRowNumbers
where Row>=6 and Row<=10
3.使用表变量实现
declare @Products TABLE
(RowNumber int,
ProductID int,
Name varchar(50),
Description varchar(5000)
)
insert into @Projucts
select ROW_NUMBER() OVER (order by Product.ProductID) as Row,
ProductID,Name,Description
from Product
select Name,Description from @Products
where RowNumber>6 and RowNumber<=10
)