1. set ANSI_NULLS ON
  2. set QUOTED_IDENTIFIER ON
  3. go
  4. -- ==================================================
  5. -- Author:        Aaron Longnion
  6. -- Create date: 10/18/2007
  7. -- Description:    A gereral-use way of dynamically
  8. --        creating SQL to easily paginate the results;
  9. --        also includes a total record count based on
  10. --        the search criteria in the WHERE clause
  11. -- ==================================================
  12. ALTER PROCEDURE [dbo].[sproc_pagination]
  13.     -- Add the parameters for the stored procedure here
  14.     @SqlColumns VARCHAR(MAX),
  15.     @SqlFriendlyColumns VARCHAR(MAX),
  16.     @SqlTableClause VARCHAR(MAX),
  17.     @StartRow INT,
  18.     @EndRow INT,
  19.     @SqlWhere VARCHAR(MAX),
  20.     @SqlRowNumOrderBy VARCHAR(MAX),
  21.     @SqlOuterOrderBy VARCHAR(MAX)
  22. AS
  23. DECLARE @rsSQL NVARCHAR(MAX)
  24. DECLARE @rcSQL NVARCHAR(MAX)
  25. BEGIN
  26.     -- SET NOCOUNT ON added to prevent extra result sets from
  27.     -- interfering with SELECT statements.
  28.     SET NOCOUNT ON;
  29.     -- build pagination SQL, using StartRow and EndRow to determine
  30.     -- which results to output
  31.     SET @rsSQL = N' WITH tempTable AS ( ' +
  32.         N' SELECT ' +
  33.             @SqlColumns +
  34.         N' , ROW_NUMBER() OVER(ORDER BY ' +
  35.             @SqlRowNumOrderBy +
  36.         N' ) AS RowNumber ' +
  37.         N' FROM ' +
  38.             @SqlTableClause
  39.     IF @SqlWhere + '' <> ''
  40.         BEGIN
  41.             SET @rsSQL = @rsSQL +                 
  42.                 N' WHERE ' +
  43.                     @SqlWhere
  44.         END
  45.     SET @rsSQL = @rsSQL +
  46.         N' ) SELECT ' +
  47.             @SqlFriendlyColumns +
  48.         N' FROM tempTable ' +
  49.         N' WHERE RowNumber >= ' +
  50.             CAST(@StartRow AS NVARCHAR(32)) +
  51.         N' AND RowNumber <= ' +
  52.             CAST(@EndRow AS NVARCHAR(32)) +
  53.         N' ORDER BY ' +
  54.             @SqlOuterOrderBy
  55.     
  56.     -- uncomment PRINT to debug
  57.     --PRINT @rsSQL
  58.     EXEC sp_executesql @rsSQL
  59.     -- build second recordset simple for the count
  60.     SET @rcSQL =
  61.             N'SELECT COUNT(*) AS CountAll FROM ' +
  62.                 @SqlTableClause
  63.     IF @SqlWhere + '' <> ''
  64.         BEGIN
  65.             SET @rcSQL = @rcSQL +                 
  66.                 N' WHERE ' +
  67.                     @SqlWhere
  68.         END
  69.     
  70.     EXEC sp_executesql @rcSQL    
  71.     SET NOCOUNT OFF;
  72. END