上一篇的博客是子查詢分頁,在數據量大的情況下,分頁的效率是非常低。今天來講一下行號分頁,這個是用的比較多的。
數據庫還是用Northwind數據庫。就用Orders表為例子吧,假設每頁都顯示10條記錄。
我們先查詢第一頁的數據。
SELECT *FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY OrderID ) AS RowNumber , * FROM Orders ) TWHERE RowNumber BETWEEN 1 AND 10
這里用到一個函數ROW_NUMBER() OVER函數,這個函數的語法是ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)
簡單的說ROW_NUMBER()從1開始,為每一條分組記錄返回一個數字,這里的ROW_NUMBER() OVER (ORDER BY OrderID) 是先把OrderID列升序,再為升序以后的每條記錄返回一個序號。
接下來,查詢第二頁的數據。
SELECT *FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY OrderID ) AS RowNumber , * FROM Orders ) TWHERE RowNumber BETWEEN 11 AND 20
由此可以推斷出,第N頁的數據為
SELECT *FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY OrderID ) AS RowNumber , * FROM Orders ) TWHERE RowNumber BETWEEN (N-1)*10+1 AND N*10
寫成通用的SQL語句如下:
BEGIN DECLARE @PageSize INT --每頁顯示條數 DECLARE @PageIndex INT --頁碼(從1開始) SET @PageSize = 10 SET @PageIndex = 2 SELECT * FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY OrderID ) AS RowNumber , * FROM Orders ) T WHERE RowNumber BETWEEN ( ( @PageIndex - 1 ) * @PageSize + 1 ) AND ( @PageIndex * @PageSize ) ORDER BY OrderID ASCEND
寫成存儲過程如下:
--存儲過程CREATE PROCEDURE P_GetPagedOrders2 @PageSize INT , --每頁顯示條數 @PageIndex INT , --頁碼(從1開始) @RecordCount INT OUTPUT , --數據總數 @PageCount INT OUTPUT --總頁數AS BEGIN --獲取數據總數 SELECT @RecordCount = COUNT(1) FROM dbo.Orders --計算總頁數 SET @PageCount = @RecordCount / @PageSize IF @RecordCount % @PageSize > 0 BEGIN SET @PageCount = @PageCount + 1 END --獲取當前頁的數據 SELECT * FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY OrderID ) AS RowNumber , * FROM Orders ) T WHERE RowNumber BETWEEN ( ( @PageIndex - 1 ) * @PageSize + 1 ) AND ( @PageIndex * @PageSize ) ORDER BY OrderID ASC END
測試存儲過程
DECLARE @RecordCount int, @PageCount intEXEC [P_GetPagedOrders2] @PageSize = 10, @PageIndex = 2, @RecordCount = @RecordCount OUTPUT, @PageCount = @PageCount OUTPUTSELECT @RecordCount as N'@RecordCount', @PageCount as N'@PageCount'
測試結果如下
不足之處,還望各位大神指正,不勝感激。
新聞熱點
疑難解答