2009-08-16 15:20
在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