国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

行號分頁

2024-07-21 02:46:49
字體:
來源:轉載
供稿:網友
行號分頁

上一篇的博客是子查詢分頁,在數據量大的情況下,分頁的效率是非常低。今天來講一下行號分頁,這個是用的比較多的。

數據庫還是用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'

測試結果如下

不足之處,還望各位大神指正,不勝感激。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 哈巴河县| 崇阳县| 奎屯市| 合阳县| 江孜县| 闽清县| 大化| 江阴市| 钟祥市| 成都市| 涪陵区| 西峡县| 茶陵县| 阳西县| 团风县| 荥阳市| 沾化县| 洪泽县| 咸阳市| 金寨县| 陇南市| 上栗县| 田东县| 宁津县| 无极县| 永泰县| 长垣县| 池州市| 万荣县| 宜城市| 太和县| 武宣县| 全州县| 梁河县| 久治县| 吉首市| 昌都县| 青铜峡市| 兖州市| 河曲县| 金湖县|