Pagination with the stored procedure

sql, sql-server, stored-procedures, t-sql

Solution

One way (possibly not the best) to do it is to use dynamic SQL

CREATE PROCEDURE [sp_Mk]
 @page INT,
 @size INT,
 @sort nvarchar(50) ,
 @totalrow INT  OUTPUT
AS
BEGIN
    DECLARE @offset INT
    DECLARE @newsize INT
    DECLARE @sql NVARCHAR(MAX)

    IF(@page=0)
      BEGIN
        SET @offset = @page
        SET @newsize = @size
       END
    ELSE 
      BEGIN
        SET @offset = @page*@size
        SET @newsize = @size-1
      END
    SET NOCOUNT ON
    SET @sql = '
     WITH OrderedSet AS
    (
      SELECT *, ROW_NUMBER() OVER (ORDER BY ' + @sort + ') AS ''Index''
      FROM [dbo].[Mk] 
    )
   SELECT * FROM OrderedSet WHERE [Index] BETWEEN ' + CONVERT(NVARCHAR(12), @offset) + ' AND ' + CONVERT(NVARCHAR(12), (@offset + @newsize)) 
   EXECUTE (@sql)
   SET @totalrow = (SELECT COUNT(*) FROM [Mk])
END

Here is SQLFiddle demo

Problem

I am trying to add sorting feature of my pagination stored procedure. How can I do this, so far I created this one. It works fine but when pass the `@sort` parameter, it didn't work. ``` ALTER PROCEDURE [dbo].[sp_Mk] @page INT, @size INT, @sort nvarchar(50) , @totalrow INT OUTPUT AS BEGIN DECLARE @offset INT DECLARE @newsize INT IF(@page=0) begin SET @offset = @page; SET @newsize = @size end ELSE begin SET @offset = @page+1; SET @newsize = @size-1 end -- SET NOCOUNT ON added to prevent extra result sets from SET NOCOUNT ON; WITH OrderedSet AS ( SELECT *, ROW_NUMBER() OVER (ORDER BY @sort DESC) AS 'Index' FROM [dbo].[Mk] ) SELECT * FROM OrderedSet WHERE [Index] BETWEEN @offset AND (@offset + @newsize) SET @totalrow = (SELECT COUNT(*) FROM [dbo].[Mk]) END ```

Original source