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. Или этот общий столбец не слишком сильно повредит производительности?

Спасибо

Ответы на вопрос(5)

Ваш ответ на вопрос