分页存储过程无效

时间:2015-06-14 18:16:40

标签: sql-server stored-procedures

我正在我的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表的表架构:

ColumnName       DataType
================================
Id               int
SharerId         int
Text             nvarchar(MAX)
Published        bit
CreatedOnUtc     datetime

如何获取分页实施的CommunityPost条记录?

请帮帮我。

提前谢谢。

2 个答案:

答案 0 :(得分:2)

尝试这个

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

答案 1 :(得分:0)

该查询中有很多奇怪的事情。

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

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

第三,ORDER BY Min(Id)意味着什么?我想你的目标是ORDER BY id,但也许不是。

第四,您的默认值@PageSize很大,几乎不会低于INT的最高限额。然后你将它与某个东西相乘,并将其插入另一个INT值。如果默认使用,那几乎可以保证溢出。这是意图吗?

祝你好运,