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