微軟新的SQL Server 2005新增了數(shù)據(jù)庫分頁功能,以后再也用寫復(fù)雜不靈活而低效率的分頁存儲過程。
新的數(shù)據(jù)庫分頁功能的核心是一個叫row_number的函數(shù)
具體如下:
返回結(jié)果集分區(qū)內(nèi)行的序列號,每個分區(qū)的第一行從 1 開始。
語法
?
ROW_NUMBER ( )???? OVER ( [ <partition_by_clause> ] <order_by_clause> )
?
備注
ORDER BY 子句可確定在特定分區(qū)中為行分配唯一 ROW_NUMBER 的順序。
參數(shù)
<partition_by_clause>
將 FROM 子句生成的結(jié)果集劃入應(yīng)用了 ROW_NUMBER 函數(shù)的分區(qū)。
<order_by_clause>
確定將 ROW_NUMBER 值分配給分區(qū)中的行的順序。有關(guān)詳細信息,請參閱 ORDER BY 子句 (Transact-SQL)。
有關(guān)詳細信息,請參閱 OVER 子句 (Transact-SQL)。
返回類型
bigint
示例
以下示例將根據(jù)年初至今的銷售額,返回 AdventureWorks 中銷售人員的 ROW_NUMBER。
?復(fù)制代碼
USE AdventureWorks
GO
SELECT c.FirstName, c.LastName, ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number', s.SalesYTD, a.PostalCode
FROM Sales.SalesPerson s JOIN Person.Contact c on s.SalesPersonID = c.ContactID
JOIN Person.Address a ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0
?
以下示例將返回行號為 50 到 60(含)的行,并以 OrderDate 排序。
?復(fù)制代碼
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;?
==============================
進過我對百萬行數(shù)據(jù)記錄的分頁測試,效率比以前網(wǎng)上能夠找到的最好的存儲過程(個人意見)稍高。
但是還是比同樣的Oralce的分頁效率低。
凡是有該標志的文章,都是該blog博主Caoer(草兒)原創(chuàng),凡是索引、收藏
、轉(zhuǎn)載請注明來處和原文作者。非常感謝。