在T-SQL中分页

时间:2011-07-02 03:06:12

标签: sql-server tsql sql-server-2008 pagination

ALTER PROCEDURE [dbo].[getMessages]
    -- Add the parameters for the stored procedure here
    @lastRow int,
    @sort varchar(9)
AS
BEGIN
    -- Insert statements for procedure here
    DECLARE @StartRow INT,@EndRow INT
    SELECT @StartRow = (@lastRow + 1), @EndRow = (@lastRow + 6)

;WITH cte AS (SELECT ROW_NUMBER() OVER (ORDER BY
        CASE WHEN @sort = 'votes1' THEN m.votes END DESC,
        CASE WHEN @sort = 'votes2' THEN m.votes END ASC
      ) AS rows,
      m.message,
      m.messageId,
      TotalCount = COUNT(m.messageId) OVER ( PARTITION BY NULL)
    FROM
      tblMessages m
    WHERE
      m.deleted != 1
      )
     SELECT * 
     FROM cte WHERE ROWS BETWEEN @StartRow AND @EndRow
    ORDER BY rows
END

所以这是我用于分页的proc,所以在前端我可以传入我看到的最后一行,然后当我点击“加载更多”时,它从下一行开始并获得下一个6。好吧,不是我想要PREVIOUS 6,传入一个id,所以如果你看到6,那么去下一个6,然后再想要看到之前的6个。

我如何修改此proc来做到这一点?

2 个答案:

答案 0 :(得分:2)

你没有。

相反,修改您的代码。 proc中的关键是@lastrow。当你第一次执行它时,我假设@lastrow = 0.如果它们继续执行,你将以值6执行它。

要向后移动,只需传递当前值 - 6.例如,如果您在第20页,则@lastrow将为114.在代码中减去6 并调用proc试。

答案 1 :(得分:1)

你正在传递“最后一行”,但你并没有传递任何告诉你方向的东西。而不是传递到最后一行,为什么不传入你想要的页码?第1页=第1-6行,第2页=第7-12行等等。现在,该过程不必记住状态,因为它只关心下一个您想要的行集。如果您搜索分页存储过程,您会发现许多示例完全符合您的要求。