Paging i sorting

Objavljeno: 19-01-2015 | Autor: Milen Blagojević | Kategorija: T-SQL

0

Ukoliko imate zahtev da je potrebno stored procedurom vratiti određeni broj redova sortiranih po nekom redosledu ovo je jedan od načina kojim to može da se uradi.
Recimo da je gridu koji podržava sorting i paging potrebno vratiti crtane likove za određeni crtani film zajedno sa ukupnim brojem redova.
U tom slučaju bi kreirali sledeću stored proceduru:

CREATE PROCEDURE GetCrtaniLikovi
	@CrtacID INT,
	@PageIndex INT, -- indeks strane na kojoj se trenutno nalazite u gridu
	@PageSize INT, -- veličina strane
	@OrderBy NVARCHAR(256),-- ime kolone ili više njih po kojima se radi sorting
	@Rowcount BIGINT OUT-- ukupan broj redova
AS
BEGIN
	DECLARE @ParmDefinition NVARCHAR(500) ,
            @Tsql NVARCHAR(MAX) ,
            @StartRow INT , --pocetni red za paging
            @EndRow INT --krajnji red za paging

    SET @ParmDefinition = N'@StartRow INT,
							@EndRow INT,
							@CrtacID INT'

	SELECT @StartRow = @PageIndex * @PageSize,
		    @EndRow = ( @PageIndex + 1 ) * @PageSize

	SET @Tsql = N'WITH CTE AS( SELECT CL.[LikID],
									  CL.[Ime],
									  CL.[Opis], 
									  ROW_NUMBER() OVER(ORDER BY ' + @OrderBy + ') AS RowNumber
							  FROM [dbo].[CrtaniLikovi] CL 
							  WHERE CL.CrtacID =  @CrtacID)
				 SELECT [LikID],
						[Ime],
						[Opis]
				 FROM CTE
				 WHERE RowNumber > @StartRow AND RowNumber <= @EndRow '

	EXECUTE sp_executesql @Tsql, 
					  @ParmDefinition,
					  @StartRow = @StartRow, 
					  @EndRow = @EndRow,
					  @CrtacID = @CrtacID;

	SELECT @Rowcount = COUNT(CE.LikID)
	FROM  [dbo].[CrtaniLikovi] CE 
	WHERE CE.CrtacID =  @CrtacID
END

Primer za izvršavanje stored procedure sa sledećim parametrima:

DECLARE @Rowcount BIGINT
EXECUTE GetCrtaniLikovi
	@CrtacID = 1,
	@PageIndex = 0,
	@PageSize = 6,
	@OrderBy = 'Ime ASC, Opis DESC',
	@Rowcount = @Rowcount OUT
SELECT @Rowcount BrRedova

Ovaj način je primenjiv na svim verzijama SQL Servera od 2005, a počevši od verzije 2012, isto je moguće obaviti i lakše uz pomoć OFFSET/FETCH klauzule što će biti opisano u jednom od narednih članaka.