Mam więc funkcję, która zwraca liczbę rekordów, dla których chcę zaimplementować stronicowanie w mojej witrynie. Zasugerowano mi, żebym w tym celu użyć opcji Przesunięcie / pobranie dalej w programie SQL Server 2012. Na naszej stronie internetowej mamy obszar, który zawiera całkowitą liczbę rekordów i stronę, na której jesteś w danym momencie.
Wcześniej otrzymywałem cały zestaw rekordów i byłem w stanie programowo zbudować stronicowanie. Ale używając metody SQL z FETCH NEXT X ROWS TYLKO, otrzymuję tylko X wierszy, więc nie wiem, jaki jest mój całkowity zestaw rekordów i jak obliczyć moje strony minimalne i maksymalne. Jedynym sposobem, w jaki mogę to zrobić, jest dwukrotne wywołanie funkcji i zliczenie wierszy w pierwszym, a następnie uruchomienie drugiego z poleceniem FETCH NEXT. Czy jest lepszy sposób, w którym nie będę musiał dwukrotnie uruchamiać zapytania? Próbuję przyspieszyć działanie, a nie zwolnić.
źródło
Napotkałem pewne problemy z wydajnością przy użyciu metody COUNT ( ) OVER (). (Nie jestem pewien, czy był to serwer, ponieważ zwrócenie 10 rekordów zajęło 40 sekund, a później nie było żadnych problemów.) Ta technika działała we wszystkich warunkach bez konieczności użycia COUNT ( ) OVER () i realizuje ta sama rzecz:
DECLARE @PageSize INT = 10, @PageNum INT = 1; WITH TempResult AS( SELECT ID, Name FROM Table ), TempCount AS ( SELECT COUNT(*) AS MaxRows FROM TempResult ) SELECT * FROM TempResult, TempCount ORDER BY TempResult.Name OFFSET (@PageNum-1)*@PageSize ROWS FETCH NEXT @PageSize ROWS ONLY
źródło
Na podstawie odpowiedzi Jamesa Moberga :
Jest to alternatywne użycie
Row_Number()
, jeśli nie masz serwera SQL 2012 i nie możesz użyć PRZESUNIĘCIADECLARE @PageNumEnd INT = 10, @PageNum INT = 1; WITH TempResult AS( SELECT ID, NAME FROM Tabla ), TempCount AS ( SELECT COUNT(*) AS MaxRows FROM TempResult ) select * from ( SELECT ROW_NUMBER() OVER ( ORDER BY PolizaId DESC) AS 'NumeroRenglon', MaxRows, ID, Name FROM TempResult, TempCount )resultados WHERE NumeroRenglon >= @PageNum AND NumeroRenglon <= @PageNumEnd ORDER BY NumeroRenglon
źródło