程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL Server 2005 利用新的ranking函數實現高效的數據分頁操作

SQL Server 2005 利用新的ranking函數實現高效的數據分頁操作

編輯:關於SqlServer

最近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新特性,見文檔:

http://msdn.microsoft.com/sql/archive/default.ASPx?pull=/library/en-us/dnsql90/Html/sql_05tsqlenhance.ASP


<
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved