如何在不使用 OFFSET MSSQL 服务器的情况下在存储过程中使用分页?

How to use Pagination in stored procedure without using OFFSET MSSQL server?

如何在不使用OFFSET MSSQL服务器的情况下在存储过程中使用分页?
我想在 asp .net web 应用程序 (MVC)

中像 Google 一样实现分页
ALTER PROCEDURE BooksGetList
    @BookName VARCHAR(50) = null, @BookPublisherId INT = null, @BookCategoryId INT = null
    AS BEGIN
    SELECT 
        ISNULL([Books].[BookId], '') AS [BookId],
        ISNULL([Books].[BookName], '') AS [BookName],
        ISNULL([BookCategories].[BookCategoryId], '') AS [BookCategoryId],
        ISNULL([BookCategories].[BookCategoryName], '') AS [BookCategoryName],
        ISNULL([BookPublishers].[BookPublisherId], '') AS [BookPublisherId],    
        ISNULL([BookPublishers].[BookPublisherName], '') AS [BookPublisherName],    
        ISNULL([Books].[BookQuantity], '') AS [BookQuantity],
        ISNULL([Books].[IsActive], '') AS [IsActive]
    FROM
        [Books] Inner Join BookCategories On [BookCategories].BookCategoryId = [Books].BookCategoryId
                Inner Join BookPublishers On [BookPublishers].BookPublisherId = [Books].BookPublisherId
    Where
         ([Books].[BookName] LIKE '%'+@BookName+'%' OR @BookName IS NULL)
    AND  ([BookCategories].BookCategoryId = @BookCategoryId OR @BookCategoryId IS NULL)     
    AND  ([BookPublishers].BookPublisherId  = @BookPublisherId OR @BookPublisherId IS NULL)

    
    ORDER BY BookId

END
GO

如果您使用 2008 R2 或更早版本,则无法使用 OFFSET FETCH,

您可以选择使用 ROW_NUMBER() 并重写您的查询,例如:

带有偏移量

SELECT Price
FROM dbo.Inventory
ORDER BY Price OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY

此查询没有使用 ROW_NUMBER()

的 OFFSET
SELECT Price
FROM
(
SELECT Price
ROW_NUMBER() OVER (ORDER BY Price) AS Seq
FROM dbo.Inventory
)t
WHERE Seq BETWEEN 11 AND 15

为了解决我的问题,我使用了

ALTER PROCEDURE BooksGetList
    @BookName VARCHAR(50) = null, @BookPublisherId INT = null, @BookCategoryId INT = null, @PageNumber INT = 1, @PageSize INT = 10,@TotalRecords INT = null OUT
    AS BEGIN
    SELECT 
        [Books].[BookId],                           [Books].[BookName],
        [BookCategories].[BookCategoryId],          [BookCategories].[BookCategoryName],
        [BookPublishers].[BookPublisherId],         [BookPublishers].[BookPublisherName],   
        [BookQuantity],                             [Books].[IsActive],
        [Books].[CreatedBy],                        [Books].[CreatedOn],        
        [Books].[ModifiedBy],
        [Books].[ModifiedOn],                       ROW_NUMBER() OVER (ORDER BY BookId) as RowNumber into #TempBooks
    FROM
        [Books] Inner Join BookCategories On [BookCategories].BookCategoryId = [Books].BookCategoryId
                Inner Join BookPublishers On [BookPublishers].BookPublisherId = [Books].BookPublisherId
    Where
         ([Books].[BookName] LIKE '%'+@BookName+'%' OR @BookName IS NULL)
         AND  ([BookCategories].BookCategoryId = @BookCategoryId OR @BookCategoryId IS NULL)    
         AND  ([BookPublishers].BookPublisherId  = @BookPublisherId OR @BookPublisherId IS NULL) 
         AND  Books.IsActive = 1 
    ORDER BY 
         BookId 
    SELECT @TotalRecords = COUNT(BookId) FROM #TempBooks    
    SET @TotalRecords =  @TotalRecords
    SELECT *,  @TotalRecords AS TotalRecords FROM #TempBooks
    WHERE RowNumber between (@PageNumber - 1) * @PageSize + 1 and @PageNumber * @PageSize
    DROP TABLE #TempBooks
END
GO