我们在写存储过程对某个结果集进行分页处理,可以使用SQL SERVER 2005提供的ROW_NUMBER()函数进行操作。我们可以看下一个示例:
USE AdventureWorks; GO;WITH OrderedOrders AS(SELECT SalesOrderID, OrderDate,ROW_NUMBER() OVER (order by OrderDate)as RowNumber FROM Sales.SalesOrderHeader ) SELECT * FROM OrderedOrders WHERE RowNumber between 50 and 60;
这个样我们可以查出 Sales.SalesOrderHeader表中50-60行之间的数据,根据OrderDate字段进行排序。从这个示例我们可以得到启发写一个如下的分页存储过程用于实际应用。该存储过程未必效率是最好的,只是抛砖引玉,希望供大家参考。
CREATE PROCEDURE [dbo].[usp_GetPagedResult_ByTbName]
(
@TableName NVARCHAR(100),
@FiledName NVARCHAR(100),
@PageIndex INT,
@PageSize INT
)
AS
DECLARE @BeginRow INT,@EndRow INT,@SQL NVARCHAR(1000);
SET @BeginRow=0;
SET @EndRow=0;
SET @BeginRow=(@PageIndex-1)*@PageSize+1;
SET @EndRow=@PageIndex*@PageSize;
IF(Len(ISNULL(@TableName,''))>0)
BEGIN
IF (LEN(ISNULL(@FiledName,''))>0)
BEGIN
SET @SQL=ISNULL(@SQL,'');
SET @SQL=@SQL+'WITH TMP AS ( SELECT *,ROW_NUMBER() OVER( ORDER BY '+@FiledName+') AS ROWNUM FROM '+@TableName+') ';
SET @SQL=@SQL+' SELECT * FROM TMP WHERE ROWNUM BETWEEN '+CAST(@BeginRow AS NVARCHAR)+' AND '+ CAST(@EndRow AS NVARCHAR);
PRINT @SQL;
EXEC (@SQL);
END
END