Getting total row count from OFFSET / FETCH NEXT

前端 未结 3 789
花落未央
花落未央 2020-12-02 05:40

So, I\'ve got a function that returns a number of records that I want to implement paging for on my website. It was suggested to me that I use the Offset/Fetch Next in SQL

相关标签:
3条回答
  • 2020-12-02 06:31

    Based on James Moberg's answer:

    This is an alternative using Row_Number(), if you don't have SQL server 2012 and you can't use OFFSET

    DECLARE 
        @PageNumEnd INT = 10, 
        @PageNum  INT = 1;
    
    WITH TempResult AS(
        SELECT ID, NAME
        FROM Tabla
    ), TempCount AS (
        SELECT COUNT(*) AS MaxRows FROM TempResult
    )
    
    select * 
    from
    (
        SELECT
         ROW_NUMBER() OVER ( ORDER BY PolizaId DESC) AS 'NumeroRenglon', 
         MaxRows, 
         ID,
         Name
        FROM TempResult, TempCount
    
    )resultados
    WHERE   NumeroRenglon >= @PageNum
        AND NumeroRenglon <= @PageNumEnd
    ORDER BY NumeroRenglon
    
    0 讨论(0)
  • 2020-12-02 06:32

    I encountered some performance issues using the COUNT() OVER() method. (I'm not sure if it was the server as it took 40 seconds to return 10 records and then later didn't have any issues.) This technique worked under all conditions without having to use COUNT() OVER() and accomplishes the same thing:

    DECLARE 
        @PageSize INT = 10, 
        @PageNum  INT = 1;
    
    WITH TempResult AS(
        SELECT ID, Name
        FROM Table
    ), TempCount AS (
        SELECT COUNT(*) AS MaxRows FROM TempResult
    )
    SELECT *
    FROM TempResult, TempCount
    ORDER BY TempResult.Name
        OFFSET (@PageNum-1)*@PageSize ROWS
        FETCH NEXT @PageSize ROWS ONLY
    
    0 讨论(0)
  • 2020-12-02 06:34

    You can use COUNT(*) OVER() ... here is a quick example using sys.all_objects:

    DECLARE 
      @PageSize INT = 10, 
      @PageNum  INT = 1;
    
    SELECT 
      name, object_id, 
      overall_count = COUNT(*) OVER()
    FROM sys.all_objects
    ORDER BY name
      OFFSET (@PageNum-1)*@PageSize ROWS
      FETCH NEXT @PageSize ROWS ONLY;
    

    However, this should be reserved for small data sets; on larger sets, the performance can be abysmal. See this Paul White article for better alternatives, including maintaining indexed views (which only works if the result is unfiltered or you know WHERE clauses in advance) and using ROW_NUMBER() tricks.

    0 讨论(0)
提交回复
热议问题