在CodeProject找到的利用RowCount()来排序的存储过程。作了一点点改动,效率不知道是不是真的好,至少是可用的,很方便。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

Create PROCEDURE [dbo].[PageView]
  @DataSrc nvarchar(200)
 ,@OrderBy nvarchar(200)
 ,@FieldList nvarchar(200) = '*'
 ,@SrcFieldList nvarchar(200) = '*'
 ,@Filter nvarchar(200) = ''
 ,@PageNum int = 1
 ,@PageSize int = 10
AS
  SET NOCOUNT ON
  DECLARE
     @STMT nvarchar(max)         -- SQL to execute
    ,@recct int                  -- total # of records (for GridView paging interface)
    ,@pagect int

  --IF LTRIM(RTRIM(@Filter)) = '' SET @Filter = '1 = 1'
  SET @Filter = '(1 = 1)' + @Filter
  IF @PageSize IS NULL BEGIN
    SET @STMT =  'SELECT   ' + @FieldList +
                 'FROM     ' + @DataSrc +
                 'WHERE    ' + @Filter +
                 'ORDER BY ' + @OrderBy
    EXEC (@STMT)                 -- return requested records
  END ELSE BEGIN
    SET @STMT =  'SELECT   @recct = COUNT(*), @pagect = (@recct + ' + CAST(@PageSize AS varchar(10)) + ' - 1 ) / ' + CAST(@PageSize AS varchar(10)) + '
                  FROM     ' + @DataSrc + '
                  WHERE    ' + @Filter
    EXEC sp_executeSQL @STMT, @params = N'@recct INT OUTPUT, @pagect INT OUTPUT', @recct = @recct OUTPUT, @pagect = @pagect OUTPUT
    SELECT @recct AS recct, @pagect AS pagect       -- return the total # of records

    DECLARE
      @lbound int,
      @ubound int

    SET @pageNum = ABS(@pageNum)
    SET @PageSize = ABS(@PageSize)
    IF @pageNum < 1 SET @pageNum = 1
    IF @PageSize < 1 SET @PageSize = 1
    SET @lbound = ((@pageNum - 1) * @PageSize)
    SET @ubound = @lbound + @PageSize + 1
    IF @lbound >= @recct BEGIN
      SET @ubound = @recct + 1
      SET @lbound = @ubound - (@PageSize + 1) -- return the last page of records if                                               -- no records would be on the
                                              -- specified page
    END
    SET @STMT =  'SELECT  ' + @FieldList + '
                  FROM    (
                            SELECT  ROW_NUMBER() OVER(ORDER BY ' + @OrderBy + ') AS row, '+ @SrcFieldList + '
                            FROM    ' + @DataSrc + '
                            WHERE   ' + @Filter + '
                          ) AS tbl
                  WHERE
                          row > ' + CONVERT(varchar(9), @lbound) + ' AND
                          row < ' + CONVERT(varchar(9), @ubound)
    EXEC (@STMT)                 -- return requested records
    PRINT @STMT
  END