【发布时间】:2014-02-27 12:55:14
【问题描述】:
我想使用分页进行数据库查询。因此,我使用了一个公用表表达式和一个排名函数来实现这一点。看下面的例子。
declare @table table (name varchar(30));
insert into @table values ('Jeanna Hackman');
insert into @table values ('Han Fackler');
insert into @table values ('Tiera Wetherbee');
insert into @table values ('Hilario Mccray');
insert into @table values ('Mariela Edinger');
insert into @table values ('Darla Tremble');
insert into @table values ('Mammie Cicero');
insert into @table values ('Raisa Harbour');
insert into @table values ('Nicholas Blass');
insert into @table values ('Heather Hayashi');
declare @pagenumber int = 2;
declare @pagesize int = 3;
declare @total int;
with query as
(
select name, ROW_NUMBER() OVER(ORDER BY name ASC) as line from @table
)
select top (@pagesize) name from query
where line > (@pagenumber - 1) * @pagesize
在这里,我可以指定@pagesize 和@pagenumber 变量来提供我想要的记录。但是,此示例(来自存储过程)用于在 Web 应用程序中进行网格分页。此 Web 应用程序需要显示页码。例如,如果数据库中有 12 条记录并且页面大小为 3,那么我将不得不显示 4 个链接,每个链接代表一个页面。
但我不能在不知道有多少记录的情况下执行此操作,而这个示例只是给了我记录的子集。
然后我将存储过程更改为返回计数(*)。
declare @pagenumber int = 2;
declare @pagesize int = 3;
declare @total int;
with query as
(
select name, ROW_NUMBER() OVER(ORDER BY name ASC) as line, total = count(*) over()from @table
)
select top (@pagesize) name, total from query
where line > (@pagenumber - 1) * @pagesize
因此,与每一行一起,它将显示记录总数。但我不喜欢它。
我的问题是是否有更好的方法(性能)来做到这一点,也许设置 @total 变量而不在 SELECT 中返回此信息。还是这个总列不会对性能造成太大影响?
谢谢
【问题讨论】:
标签: sql-server pagination common-table-expression