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.