Базата данни може да има стотици хиляди записи. Лесно е да вмъкнете и изберете тези записи чрез системи за управление на база данни като SQL Server или MySQL и т.н. Не е лесно обаче да се показват хиляди записи на една уеб страница или в настолно приложение. Ограниченията в пространството и паметта затрудняват показването на огромен брой записи наведнъж.
Често срещано решение на такъв проблем е внедряването на пейджинг. (Забележете, че това не е пейджинг в паметта, реализиран от операционни системи) Страничната страница в програмирането се отнася до показване на данни чрез поредица от страници. Случайно търсене в Google може да доведе до хиляди резултати. Google използва пейджинг, за да покаже тези резултати. Ако превъртите надолу страницата на Google с резултати от търсенето, ще видите следното:
Тук можете да видите броя на страниците, на които е разделен резултатът от търсенето. Можете да щракнете върху връзката Следващ, за да видите още страници.
В тази статия ще видим как операторите OFFSET FETCH NEXT могат да се използват за внедряване на пейджинг в приложения от предния край. Ще започнем с прост пример с помощта на оператора OFFSET FETCH NEXT и след това ще видим как може да се използва на практика с помощта на съхранена процедура.
Използване на OFFSET FETCH NEXT за пейджинг в SQL Server
SQL Server съдържа операторите OFFSET &NEXT за реализиране на пейджинг. Операторът OFFSET компенсира следващия K брой резултати от търсенето от началото, докато операторът FETCH NEXT извлича NEXT N резултати, където K и N са цели числа.
Подготовка на фиктивни данни
Преди да можем да видим OFFSET FETCH NEXT в действие, нека създадем фиктивна база данни с 200 записа. Можете да използвате работеща база данни, ако сте 100% уверени, че тя е правилно архивирана. За да направите това, изпълнете следния скрипт:
CREATE Database ShowRoom; GO USE ShowRoom; CREATE TABLE Cars ( id INT PRIMARY KEY IDENTITY, name VARCHAR(50) NOT NULL, company VARCHAR(50) NOT NULL, power INT NOT NULL )
В скрипта по-горе създаваме фиктивна база данни ShowRoom с една таблица, наречена Cars. Нека добавим някои фиктивни записи в тази база данни. Изпълнете следния скрипт:
USE ShowRoom DECLARE @count INT SET @count = 1 DECLARE @carname VARCHAR (50) DECLARE @company_name VARCHAR (50) WHILE (@count <= 200) BEGIN SET @carname = 'Car - ' + LTRIM(@count) SET @company_name = 'Company - '+ LTRIM(@count) INSERT INTO Cars VALUES (@carname, @company_name, @count * 5) SET @count = @count + 1 END
Разгледайте внимателно горния скрипт. Горният скрипт вмъква 200 фиктивни записа в таблицата Cars. Скриптът използва цикъл while за 200 повторения. Всяко повторение добавя думата „Car -“ към номера на итерацията и резултатът се вмъква в колоната за име на таблицата Cars. По същия начин думата „Компания -“ се добавя към номера на итерацията и се вмъква в колоната на компанията във всяка итерация. Накрая, с всяка итерация, номерът на итерацията се умножава по 5 и резултатът се вмъква в колоната за мощност. Сега, ако изберете всички записи от таблицата Cars, ще видите 200 записа в набора от резултати. За да направите това, изпълнете следната заявка:
SELECT * FROM Cars
Екранна снимка на частичния резултат от горната заявка е както следва. Можете да видите 200 реда в резултата.
СЛЕДВАЩ ИЗВЪНЧАНЕ НА ОТМЕСТВАНЕ
Сега нека разгледаме OFFSET NEXT в действие. Синтаксисът на OFFSET NEXT е както следва:
SELECT * FROM Table_Name ORDER BY COLUMN_NAME/S OFFSET Number_of_rows_to_Skip ROWS FETCH NEXT Number_of_rows_to_Fetch ROWS ONLY
Тук е важно да споменем, че трябва да използвате клаузата ORDER BY с клаузите OFFSET FETCH NEXT.
Нека видим прост пример за OFFSET FETCH NEXT, където ще подредим данните по id колоната на таблицата Cars, ще пропуснем първите 20 реда и ще извлечем следващите 10 реда. Изпълнете следния скрипт:
USE ShowRoom SELECT * FROM Cars ORDER BY id OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY
В изхода на скрипта по-горе ще видите записи със стойност на идентификатор от 21 до 30, тъй като пропуснахме първите 20 записа и извлечехме следващите 10.
Използване на OFFSET FETCH NEXT със съхранена процедура
Ако внедрявате пейджинг в приложение за преден край, като например уебсайт или настолно приложение, обикновено ще изпращате стойности за номера на страницата и размера на страницата на сървъра чрез съхранена процедура. В зависимост от стойността на номера на страницата и размера на страницата, съхранената процедура ще върне правилния набор от редове. Нека напишем такава съхранена процедура, която приема номера на страница и размера на страницата като параметри и връща съответните записи.
Разгледайте следния скрипт:
USE ShowRoom GO CREATE PROC spGetRecordsByPageAndSize @Page INT, @Size INT AS BEGIN SELECT * FROM Cars ORDER BY id OFFSET (@Page -1) * @Size ROWS FETCH NEXT @Size ROWS ONLY END
В скрипта по-горе създаваме съхранена процедура spGetRecordsByPageAndSize, която приема 2 параметъра @Page и @Size. Съхранената процедура използва OFFSET FETCH NEXT за филтриране на записи по брой страници и размер на страницата. Например, ако номерът на страницата е 2, а размерът е 20, OFFSET ще бъде:
(2 – 1) * 20 =20
И стойността за FETCH next ще бъде равна на @Size, т.е. 20. Следователно записите с идентификатор от 21 до 40 ще бъдат върнати. Изпълнете горния скрипт, за да създадете съхранена процедура.
След като създадете съхранената процедура, изпълнете следния скрипт, за да видите какво се връща, когато номерът на страницата е 2 и размерът на страницата е 20.
EXECUTE spGetRecordsByPageAndSize 2, 20
Резултатът от горния скрипт изглежда така:
По същия начин, ако искате да извлечете записи за 4-та страница с 15 записа на страница, следната заявка извлича записите от id 46 до id 60.
EXECUTE spGetRecordsByPageAndSize 4, 15
Резултатът от изглежда така:
Заключение
OFFSET FETCH NEXT е изключително полезен инструмент, особено ако искате да покажете голям брой записи, групирани в страници. В тази статия видяхме как се използва във връзка със съхранена процедура за внедряване на пейджинг в приложения от предния край.