SQL-запрос с нумерацией страниц
Я хочу сделать запрос к базе данных с нумерацией страниц. Итак, я использовал выражение общей таблицы и ранжированную функцию для достижения этой цели. Посмотрите на пример ниже.
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, чтобы получить только те записи, которые мне нужны. Однако этот пример (полученный из хранимой процедуры) используется для разбивки сетки в веб-приложении. Это веб-приложение требует показа номеров страниц. Например, если в базе данных 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. Или этот общий столбец не слишком сильно повредит производительности?
Спасибо