What is the best way to paginate results in SQL Server

前端 未结 19 2802
我寻月下人不归
我寻月下人不归 2020-11-22 01:36

What is the best way (performance wise) to paginate results in SQL Server 2000, 2005, 2008, 2012 if you also want to get the total number of results (before paginating)?

19条回答
  •  我在风中等你
    2020-11-22 02:02

    Well I have used the following sample query in my SQL 2000 database, it works well for SQL 2005 too. The power it gives you is dynamically order by using multiple columns. I tell you ... this is powerful :)

        ALTER PROCEDURE [dbo].[RE_ListingReports_SelectSummary] 
    
    @CompanyID  int,
    @pageNumber     int,
    @pageSize   int, 
    @sort       varchar(200)
    AS
    
    DECLARE @sql nvarchar(4000)
    DECLARE @strPageSize nvarchar(20)
    DECLARE @strSkippedRows nvarchar(20)
    DECLARE @strFields nvarchar(4000)
    DECLARE @strFilter nvarchar(4000)
    DECLARE @sortBy nvarchar(4000)
    DECLARE @strFrom nvarchar(4000)
    DECLARE @strID nvarchar(100)
    
    If(@pageNumber < 0)
      SET @pageNumber = 1
    SET @strPageSize = CAST(@pageSize AS varchar(20)) 
    SET @strSkippedRows = CAST(((@pageNumber - 1) * @pageSize) AS varchar(20))-- For    example if pageNumber is 5  pageSize is 10, then SkippedRows = 40.
    SET @strID = 'ListingDbID'
    SET @strFields = 'ListingDbID,
    ListingID,  
    [ExtraRoom]
    '
    SET @strFrom = ' vwListingSummary '
    
    SET @strFilter = ' WHERE
            CompanyID = ' + CAST(@CompanyID As varchar(20)) 
    End
    SET @sortBy = ''
    if(len(ltrim(rtrim(@sort))) > 0)
    SET @sortBy = ' Order By ' + @sort
    
    -- Total Rows Count
    
    SET @sql =  'SELECT Count(' + @strID + ')  FROM ' + @strFROM + @strFilter
    EXEC sp_executesql @sql
    
    --// This technique is used in a Single Table pagination
    SET @sql = 'SELECT ' + @strFields + ' FROM ' + @strFROM +
        ' WHERE ' + @strID +  ' IN ' + 
       '  (SELECT TOP ' + @strPageSize + ' ' + @strID + ' FROM ' + @strFROM + @strFilter + 
                 ' AND  ' + @strID + ' NOT IN ' + '
              (SELECT TOP ' + @strSkippedRows + ' ' + @strID + ' FROM ' + @strFROM + @strFilter + @SortBy + ') ' 
       + @SortBy + ') ' + @SortBy
    Print @sql 
    EXEC sp_executesql @sql
    

    The best part is sp_executesql caches later calls, provided you pass same parameters i.e generate same sql text.

提交回复
热议问题