Pop-Out

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
-- ==================================================
-- Author:        Aaron Longnion
-- Create date: 10/18/2007
-- Description:    A gereral-use way of dynamically
--        creating SQL to easily paginate the results;
--        also includes a total record count based on
--        the search criteria in the WHERE clause
-- ==================================================
ALTER PROCEDURE [dbo].[sproc_pagination]
    -- Add the parameters for the stored procedure here
    @SqlColumns VARCHAR(MAX),
    @SqlFriendlyColumns VARCHAR(MAX),
    @SqlTableClause VARCHAR(MAX),
    @StartRow INT,
    @EndRow INT,
    @SqlWhere VARCHAR(MAX),
    @SqlRowNumOrderBy VARCHAR(MAX),
    @SqlOuterOrderBy VARCHAR(MAX)
AS
DECLARE @rsSQL NVARCHAR(MAX)
DECLARE @rcSQL NVARCHAR(MAX)
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    -- build pagination SQL, using StartRow and EndRow to determine
    -- which results to output
    SET @rsSQL = N' WITH tempTable AS ( ' +
        N' SELECT ' +
            @SqlColumns +
        N' , ROW_NUMBER() OVER(ORDER BY ' +
            @SqlRowNumOrderBy +
        N' ) AS RowNumber ' +
        N' FROM ' +
            @SqlTableClause
    IF @SqlWhere + '' <> ''
        BEGIN
            SET @rsSQL = @rsSQL +                 
                N' WHERE ' +
                    @SqlWhere
        END
    SET @rsSQL = @rsSQL +
        N' ) SELECT ' +
            @SqlFriendlyColumns +
        N' FROM tempTable ' +
        N' WHERE RowNumber >= ' +
            CAST(@StartRow AS NVARCHAR(32)) +
        N' AND RowNumber <= ' +
            CAST(@EndRow AS NVARCHAR(32)) +
        N' ORDER BY ' +
            @SqlOuterOrderBy
    
    -- uncomment PRINT to debug
    --PRINT @rsSQL
    EXEC sp_executesql @rsSQL
    -- build second recordset simple for the count
    SET @rcSQL =
            N'SELECT COUNT(*) AS CountAll FROM ' +
                @SqlTableClause
    IF @SqlWhere + '' <> ''
        BEGIN
            SET @rcSQL = @rcSQL +                 
                N' WHERE ' +
                    @SqlWhere
        END
    
    EXEC sp_executesql @rcSQL    
    SET NOCOUNT OFF;
END

Cut-N-Paste