Sql server 分页的存储过程不工作

Sql server 分页的存储过程不工作,sql-server,stored-procedures,Sql Server,Stored Procedures,我正在asp.net应用程序中实现分页。为此,我创建了一个存储过程来从CommunityPost表中获取记录。但此存储过程工作不正常。它不返回任何记录 我的存储过程是: ALTER PROCEDURE [dbo].[CommunityPostLoadAllPaged] ( @PageIndex int = 0, @PageSize int = 2147483644, @TotalRecords int = null OUTPUT ) AS BEGIN

我正在asp.net应用程序中实现分页。为此,我创建了一个存储过程来从CommunityPost表中获取记录。但此存储过程工作不正常。它不返回任何记录

我的存储过程是:

ALTER PROCEDURE [dbo].[CommunityPostLoadAllPaged]
(
    @PageIndex    int = 0, 
    @PageSize     int = 2147483644,
    @TotalRecords int = null OUTPUT
)
AS
BEGIN
    DECLARE @sql nvarchar(max)

    --paging
    DECLARE @PageLowerBound int
    DECLARE @PageUpperBound int 
    DECLARE @RowsToReturn int

    SET @RowsToReturn = @PageSize * (@PageIndex + 1)    
    SET @PageLowerBound = @PageSize * @PageIndex
    SET @PageUpperBound = @PageLowerBound + @PageSize + 1

    CREATE TABLE #DisplayOrderTmp 
    (
        [Id] int IDENTITY (1, 1) NOT NULL,
        [CommunityPostId] int NOT NULL
    )

    SET @sql = '
    INSERT INTO #DisplayOrderTmp ([CommunityPostId])
    SELECT p.Id
    FROM
        CommunityPost p with (NOLOCK)'


    CREATE TABLE #PageIndex 
    (
        [IndexId] int IDENTITY (1, 1) NOT NULL,
        CommunityPostId int NOT NULL
    )

    INSERT INTO #PageIndex (CommunityPostId)
        SELECT CommunityPostId
        FROM #DisplayOrderTmp
        GROUP BY CommunityPostId
        ORDER BY min([Id])

    SELECT *
    FROM #PageIndex

    --total records
    SET @TotalRecords = @@rowcount

    select * from #DisplayOrderTmp

    DROP TABLE #DisplayOrderTmp

    select * from  #PageIndex

    --return products
    SELECT TOP (@RowsToReturn)
        p.*
    FROM
        #PageIndex [pi]
    INNER JOIN 
        dbo.CommunityPost p WITH (NOLOCK) ON p.Id = [pi].CommunityPostId
    WHERE
        [pi].IndexId > @PageLowerBound AND 
        [pi].IndexId < @PageUpperBound
    ORDER BY
        [pi].IndexId

    DROP TABLE #PageIndex
END
如何获取用于分页实现的CommunityPost记录

请帮帮我


提前谢谢你。

这个问题有很多奇怪的地方

最重要的是:您将@sql设置为运行一些动态sql,然后-不调用它。我看不出有任何理由将该查询作为动态SQL运行,因为其中没有变量。只要运行代码就行了

其次,在过程中运行多个选择。这是一种常见的调试技术,但可能不是您在完成的代码中想要的。如果您真的希望它返回一个表,那么在最后一个表之前删除所有选择,当然除了插入临时表的选择。实际上,它将输出几组值,我猜您的调用代码只需要其中一个

第三,MinId的命令意味着什么?我猜你的目标是按身份订购,但也许不是

第四,您的默认值@PageSize非常大,几乎不低于整数的最大限制。您将它乘以某个值,然后将其插入另一个整数值中。如果使用默认值,实际上肯定会溢出。这就是目的吗

祝你好运,试试这个

ALTER PROCEDURE [dbo].[CommunityPostLoadAllPaged]
(
    @PageIndex    int = 0, 
    @PageSize     int = 50,
    @TotalRecords int = null OUTPUT
)
AS
BEGIN

       Declare  @inEndRow       Int
        ,@inStartRow        Int 

    CREATE TABLE #DisplayOrderTmp 
    (
        [Id] int IDENTITY (1, 1) NOT NULL,
        [inRowNum] Int  Primary Key,
        [CommunityPostId] int NOT NULL
    )


    INSERT INTO #DisplayOrderTmp ([CommunityPostId])
    SELECT ROW_NUMBER() OVER(ORDER BY p.Id asc), p.Id
    FROM
        CommunityPost p with (NOLOCK)


    Select   @TotalRecords = Count(1) 
            ,@inEndRow = ((@PageIndex     + @PageSize     ) + 1)
            ,@inStartRow = @PageIndex    
    From    #DisplayOrderTmp As d With (Nolock)


   Select    *
    From    #DisplayOrderTmp  As d With (Nolock)
    Where   d.inRowNum > @inStartRow
            And d.inRowNum < @inEndRow
END

Id是您的主键吗?当您甚至没有加载该表时,为什么要从DisplayOrderTmp中选择*?您必须从PageIndex中选择*,然后进行最终选择。除非你有很好的理由不这样做,否则不要选择所有不是你想要的实际结果集的选项。
ALTER PROCEDURE [dbo].[CommunityPostLoadAllPaged]
(
    @PageIndex    int = 0, 
    @PageSize     int = 50,
    @TotalRecords int = null OUTPUT
)
AS
BEGIN

       Declare  @inEndRow       Int
        ,@inStartRow        Int 

    CREATE TABLE #DisplayOrderTmp 
    (
        [Id] int IDENTITY (1, 1) NOT NULL,
        [inRowNum] Int  Primary Key,
        [CommunityPostId] int NOT NULL
    )


    INSERT INTO #DisplayOrderTmp ([CommunityPostId])
    SELECT ROW_NUMBER() OVER(ORDER BY p.Id asc), p.Id
    FROM
        CommunityPost p with (NOLOCK)


    Select   @TotalRecords = Count(1) 
            ,@inEndRow = ((@PageIndex     + @PageSize     ) + 1)
            ,@inStartRow = @PageIndex    
    From    #DisplayOrderTmp As d With (Nolock)


   Select    *
    From    #DisplayOrderTmp  As d With (Nolock)
    Where   d.inRowNum > @inStartRow
            And d.inRowNum < @inEndRow
END