Для нашей подкачки требовалось, чтобы мы могли передавать номер текущей страницы и размер страницы (вместе с некоторыми дополнительными параметрами фильтра) в качестве переменных. Так как select top @page_size не работает в MS SQL, мы создали временную таблицу или таблицу переменных, чтобы назначить первичным ключам каждой строки идентификатор, который впоследствии можно будет отфильтровать для нужного номера страницы и размера.
** Обратите внимание, что если у вас есть первичный ключ GUID или составной ключ, вам просто нужно изменить идентификатор объекта во временной таблице на уникальный идентификатор или добавить столбцы дополнительных ключей в таблицу.
Обратной стороной этого является то, что ему все еще нужно вставить все результаты во временную таблицу, но, по крайней мере, это только ключи. Это работает в MS SQL, но должно работать на любой БД с минимальными изменениями.
объявите @page_number int, @page_size
int - добавить дополнительный поиск
параметры здесь
- создать временную таблицу со столбцом идентификаторов и идентификатором
- из записи, которую вы будете выбирать. Это в памяти
--table, поэтому, если количество строк, которые вы будете вставлять, больше,
- чем 10000, тогда вы должны использовать временную таблицу в базе данных tempdb
--вместо. Для этого используйте
--CREATE TABLE #temp_table (row_num int IDENTITY (1,1), objectid int)
--и изменить все ссылки на @temp_table на #temp_table
DECLARE @temp_table TABLE (row_num int
IDENTITY (1,1), объект int)
- вставить во временную таблицу с идентификаторами записей
- мы хотим вернуться. Очень важно убедиться, что заказ сделан
- отражает порядок возвращаемых записей, так что row_num
- Значения установлены в правильном порядке, и мы выбираем
- правильные записи, основанные на странице
INSERT INTO @temp_table
(ObjectID)
/ * Пример: выберите, что вставляет
записи во временную таблицу
ВЫБЕРИТЕ персону
ОТ ЛИЦА С
(NOLOCK)
степень внутреннего соединения с
(NOLOCK) на степень.персонала =
person.personid
ГДЕ
person.lastname = @last_name
ЗАКАЗАТЬ ЛИЦА.Имя АСС,
person.firsname asc
* /
- получить общее количество совпадающих строк
DECLARE @total_rows
int
SET @total_rows =
@@ ROWCOUNT
- рассчитать общее количество страниц на основе количества
- соответствующие строки и размер страницы, передаваемый в качестве параметра
DECLARE
@total_pages int
- добавить @page_size - 1 к общему количеству строк в
- рассчитать общее количество страниц. Это потому, что sql
- всегда округлять для деления целых чисел
SET @total_pages =
(@total_rows + @page_size - 1) /
@page_size
- верните интересующий нас набор результатов, присоединившись
- возврат к @temp_table и фильтрация по row_num
/ * Пример:
Выбор данных для возврата. Если
Вставка была выполнена
правильно, затем
ты всегда должен быть за столом
содержит
строки для возврата
в столбце объектива на
@ Temp_table
ВЫБРАТЬ человека. *
ОТ человека С
(NOLOCK) ВНУТРЕННЕЕ СОЕДИНЕНИЕ @temp_table
tt
ON person.personid =
tt.objectid
* /
- вернуть только те строки на интересующей нас странице
- и упорядочить по столбцу row_num @temp_table, чтобы убедиться, что
- мы выбираем правильные записи
ГДЕ tt.row_num <
(@page_size * @page_number) + 1
AND tt.row_num> (@page_size *
@page_number) - @page_size
ЗАКАЗАТЬ
BY tt.row_num