En databas kan ha hundratusentals poster. Det är lätt att infoga och välja dessa poster via databashanteringssystem som SQL Server eller MySQL etc. Det är dock inte lätt att visa tusentals poster på en enda webbsida eller i ett skrivbordsprogram. Utrymmes- och minnesbegränsningar gör det svårt att visa ett stort antal poster samtidigt.
En vanlig lösning på ett sådant problem är att implementera personsökning. (Obs, detta är inte minnessökning implementerad av operativsystem) Personsökning i programmering avser att visa data via en serie sidor. En slumpmässig sökning på Google kan resultera i tusentals resultat. Google använder personsökning för att visa dessa resultat. Om du rullar ner på Google-sidan med sökresultat ser du följande:
Här kan du se antalet sidor som sökresultatet är uppdelat på. Du kan klicka på länken Nästa för att se fler sidor.
I den här artikeln kommer vi att se hur OFFSET FETCH NEXT-operatorer kan användas för att implementera personsökning i front-end-applikationer. Vi börjar med ett enkelt exempel med operatorn OFFSET FETCH NEXT och kommer sedan att se hur den praktiskt kan användas med hjälp av en lagrad procedur.
Använda OFFSET FETCH NEXT för personsökning i SQL Server
SQL Server innehåller OFFSET &NEXT-operatorerna för att implementera personsökning. OFFSET-operatorn förskjuter nästa K-antal sökresultat från början, medan FETCH NEXT-operatorn hämtar NÄSTA N-resultat där K och N är heltal.
Förbereder dummydata
Innan vi kan se OFFSET FETCH NEXT i aktion, låt oss skapa en dummydatabas med 200 poster. Du kan använda en fungerande databas om du är 100 % säker på att den är korrekt säkerhetskopierad. Kör följande skript för att göra det:
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 )
I skriptet ovan skapar vi en dummydatabas ShowRoom med en tabell som heter Bilar. Låt oss lägga till några dummy-poster i den här databasen. Kör följande skript:
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
Ta en noggrann titt på skriptet ovan. Ovanstående skript infogar 200 dummy-poster i tabellen Bilar. Skriptet använder en while-loop för 200 iterationer. Varje iteration lägger till ordet 'Car -' till iterationsnumret och resultatet infogas i namnkolumnen i tabellen Bilar. På samma sätt läggs ordet "Företag -" till med iterationsnumret och infogas i företagskolumnen i varje iteration. Slutligen, med varje iteration, multipliceras iterationsnumret med 5 och resultatet infogas i potenskolumnen. Om du nu väljer alla poster från Bilar-tabellen kommer du att se 200 poster i resultatuppsättningen. Kör följande fråga för att göra det:
SELECT * FROM Cars
Skärmdump av det partiella resultatet av ovanstående fråga är som följer. Du kan se 200 rader i resultatet.
OFFSET FETCH NEXT Exempel
Låt oss nu titta på OFFSET NEXT i aktion. Syntaxen för OFFSET NEXT är följande:
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
Det är viktigt att nämna här att du måste använda ORDER BY-satsen med OFFSET FETCH NEXT-satser.
Låt oss se ett enkelt exempel på OFFSET FETCH NEXT där vi kommer att ordna data efter id-kolumnen i tabellen Bilar, hoppa över de första 20 raderna och hämta de nästa 10 raderna. Kör följande skript:
USE ShowRoom SELECT * FROM Cars ORDER BY id OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY
I utgången av skriptet ovan kommer du att se poster med ett id-värde på 21 till 30 eftersom vi hoppade över de första 20 posterna och hämtade de nästa 10.
Använda OFFSET FETCH NEXT med lagrad procedur
Om du implementerar personsökning i en gränssnittsapplikation som en webbplats eller en skrivbordsapplikation, skickar du vanligtvis sidnummer och sidstorleksvärden till servern via en lagrad procedur. Beroende på värdet på sidnumret och sidstorleken kommer den lagrade proceduren att returnera den korrekta uppsättningen rader. Låt oss skriva en sådan lagrad procedur som tar sidnummer och sidstorlek som parametrar och returnerar motsvarande poster.
Ta en titt på följande skript:
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
I skriptet ovan skapar vi en lagrad procedur spGetRecordsByPageAndSize som tar 2 parametrar @Page och @Size. Den lagrade proceduren använder OFFSET FETCH NEXT för att filtrera poster efter ett antal sidor och sidstorlek. Till exempel, om sidnumret är 2 och storleken är 20, blir OFFSET:
(2 – 1) * 20 =20
Och värdet för FETCH nästa kommer att vara lika med @Size, dvs. 20. Därför kommer posterna med id 21 till 40 att returneras. Utför skriptet ovan för att skapa en lagrad procedur.
När du har skapat den lagrade proceduren, kör följande skript för att se vad som returneras när sidnumret är 2 och sidstorleken är 20.
EXECUTE spGetRecordsByPageAndSize 2, 20
Utdata från ovanstående skript ser ut så här:
På liknande sätt, om du vill hämta poster för den fjärde sidan med 15 poster per sida, hämtar följande fråga posterna från id 46 till id 60.
EXECUTE spGetRecordsByPageAndSize 4, 15
Utdata från ser ut så här:
Slutsats
OFFSET FETCH NEXT är ett extremt användbart verktyg, särskilt om du vill visa ett stort antal poster grupperade i sidor. I den här artikeln såg vi hur det används i kombination med en lagrad procedur för att implementera personsökning i front-end-applikationer.