zoukankan      html  css  js  c++  java
  • Sql Server系列:查询分页语句

    1 利用临时表分页

      分页存储过程:

    CREATE PROCEDURE [USP_Product_GetPaged]
        @WhereClause VARCHAR (2000),
        @OrderBy VARCHAR (2000),
        @PageIndex INT,
        @PageSize INT
    AS
        BEGIN
            DECLARE @PageLowerBound INT, @PageUpperBound INT
    
            SET @PageLowerBound = @PageSize * @PageIndex
            SET @PageUpperBound = @PageLowerBound + @PageSize
    
            CREATE TABLE #PageIndex
            (
                [IndexID] INT IDENTITY (1, 1) NOT NULL,
                [ProductID] INT 
            )
    
            DECLARE @SQL AS NVARCHAR(4000)
    
            SET @SQL = 'INSERT INTO #PageIndex ([ProductID])'
            SET @SQL = @SQL + ' SELECT'
            IF @PageSize > 0
                SET @SQL = @SQL + ' TOP ' + CONVERT(NVARCHAR, @PageUpperBound)
            SET @SQL = @SQL + ' [ProductID]'
            SET @SQL = @SQL + ' FROM [dbo].[Product]'
            IF LEN(@WhereClause) > 0
                SET @SQL = @SQL + ' WHERE ' + @WhereClause
            IF LEN(@OrderBy) > 0
                SET @SQL = @SQL + ' ORDER BY ' + @OrderBy
    
            EXEC (@SQL)
    
            SELECT
                TempTable.[ProductID], 
                TempTable.[ProductCode], 
                TempTable.[ProductName], 
                TempTable.[CategoryID], 
                TempTable.[UnitPrice]
            FROM
                [dbo].[Product] TempTable
            INNER JOIN
                #PageIndex PageIndex
            ON
                TempTable.[ProductID] = PageIndex.[ProductID]
            WHERE
                PageIndex.IndexID > @PageLowerBound
            AND
                PageIndex.IndexID <= @PageUpperBound
            ORDER BY
                PageIndex.IndexID
    
            SET @SQL = 'SELECT COUNT(*) AS TotalRowCount'
            SET @SQL = @SQL + ' FROM [dbo].[Product]'
            IF LEN(@WhereClause) > 0
                SET @SQL = @SQL + ' WHERE ' + @WhereClause
    
            EXEC (@SQL)
        END
    GO

      执行分页存储过程示例:

    -- 不带Where子句
    EXECUTE [USP_Product_GetPaged] '', '[ProductID] ASC', 0, 10
    EXECUTE [USP_Product_GetPaged] '', '[ProductID] ASC', 1, 10
    -- Where子句
    EXECUTE [USP_Product_GetPaged] '[UnitPrice] > 20', '[UnitPrice] DESC', 0, 10
    EXECUTE [USP_Product_GetPaged] '[UnitPrice] > 20', '[UnitPrice] DESC', 1, 10

    2 利用ROW_NUMBER()分页

      ROW_NUMBER()函数是SQL Server 2005新增的排名函数,可以使用ROW_NUMBER()进行分页。

    SELECT TOP (10) 
        [t].[ProductID] AS [ProductID], 
        [t].[ProductName] AS [ProductName]
    FROM (
        SELECT
            [ProductID] AS [ProductID],
            [ProductName] AS [ProductName],
            ROW_NUMBER() OVER (ORDER BY [ProductID] ASC) AS [row_number]
        FROM [dbo].[Product]
        WHERE [UnitPrice] > 20
    )  AS [t]
    WHERE [t].[row_number] > 10
    ORDER BY [t].[ProductID] ASC

    3 利用OFFSET...FETCH分页

      OFFSET...FETCH是在SQL Server 2012中新增的实现分页方式,OFFSET向SELECT查询表明跳过多少行,FETCH表明从特定的位置开始检索多少行。

      示例:

    SELECT [ProductID],[CategoryID],[ProductCode],[ProductName],[UnitPrice]
    FROM [dbo].[Product]
    ORDER BY [ProductID]
    OFFSET 10 ROWS
    FETCH NEXT 10 ROWS ONLY

      使用OFFSET...FETCH限制:

      ◊ 使用OFFSET...FETCH子句必须同时使用ORDER BY。

      ◊ 可以单独使用OFFSET,但不能单独使用FETCH。

      ◊ 不可以同时使用SELECT TOP 和 OFFSET...FETCH。

  • 相关阅读:
    398. Random Pick Index
    382. Linked List Random Node
    645. Set Mismatch
    174. Dungeon Game
    264. Ugly Number II
    115. Distinct Subsequences
    372. Super Pow
    LeetCode 242 有效的字母异位词
    LeetCode 78 子集
    LeetCode 404 左叶子之和
  • 原文地址:https://www.cnblogs.com/libingql/p/4471643.html
Copyright © 2011-2022 走看看