最近MSDN Magazine上的一篇文章10 Tips for Writing High-Performance Web Applications提到了有效的數據分頁技術對提高ASP .Net程序性能的重要性;並給出了一個實現數據分頁的stored procedure的例子,抄錄如下:
CREATE PROCEDURE northwind_OrdersPaged
(
@PageIndex int,
@PageSize int
)
AS
BEGIN
DECLARE @PageLowerBound int
DECLARE @PageUpperBound int
DECLARE @RowsToReturn int
-- First set the rowcount
SET @RowsToReturn = @PageSize * (@PageIndex + 1)
SET ROWCOUNT @RowsToReturn
-- Set the page bounds
SET @PageLowerBound = @PageSize * @PageIndex
SET @PageUpperBound = @PageLowerBound + @PageSize + 1
-- Create a temp table to store the select results
CREATE TABLE #PageIndex
(
IndexId int IDENTITY (1, 1) NOT NULL,
OrderID int
)
-- Insert into the temp table
INSERT INTO #PageIndex (OrderID)
SELECT
OrderID
FROM
Orders
ORDER BY
OrderID DESC
-- Return total count
SELECT COUNT(OrderID) FROM Orders
-- Return paged results
SELECT
O.*
FROM
Orders O,
#PageIndex PageIndex
WHERE
O.OrderID = PageIndex.OrderID AND
PageIndex.IndexID > @PageLowerBound AND
PageIndex.IndexID < @PageUpperBound
ORDER BY
PageIndex.IndexID
END
在SQL Server 2000裡面,由於沒有一個有效的進行ranking操作的方法,所以該例子先創建了一個有Identity字段的臨時表,利用Identity字段的自增長特性,間接的為Orders表的每一行按orderID逆序賦予了一個行號, 然後基於這個行號實現分頁。
在SQL Server 2000裡面,由於系統提供了內建的ranking函數,為了給Orders表生成行號,我們不再需要利用Identity字段。
例如,利用SQL Server 2000的ROW_NUMBER()函數,按orderID字段逆序排列,給Orders表生成行號的語句如下:
SELECT ROW_NUMBER() OVER(ORDER BY ordered DESC) AS rownum, ordered
FROM Orders
ORDER BY rownum DESC
基於這些新的ranking函數,您可以跟方便的實現數據的分頁操作。
關於SQL Server 2005的T-SQL新特性,見文檔: