【问题标题】:Get N last rows from table with one stored procedure使用一个存储过程从表中获取最后 N 行
【发布时间】:2013-03-09 08:21:04
【问题描述】:

我想用一个存储过程从表中获取最后 N 行。

我的存储过程有一些参数,如@PageNumber@RowCount 等。

我有两个问题:

  • 我需要在我的用户界面中计算行数和结果,因为我想限制我的用户在他位于最后一页并按下一页时。

  • 我希望我的用户在其他页面中时可以按最后一页。

提示:我不想执行我的存储过程两次来获取结果和行数,因为它会创建动态并且需要很长时间才能执行。

对于更多的描述,我最常说我的 sp 是这样的:

Create Procedure TestSelectBill  
(  
    @PageNumber int = 1 ,  
    @RowCount int = 5  
)  
As  
Begin  
    Select   
        *  
    From billing.BillMaster As BM  
    Where  
    ( Bm.SubscribeId = '12345674' )  
    Order by SubscribeId  
    OFFSET @PageNumber * @RowCount ROWS  
    FETCH NEXT @RowCount ROWS ONLY;  
End  

【问题讨论】:

    标签: c# stored-procedures sql-server-2012


    【解决方案1】:

    您可以在查询中使用Row_Number() 并按降序排列SubscribeIdrow[0]["RowNumber"] 是总数 像这样:

    Select
            *  ,
    ROW_NUMBER() OVER ( ORDER BY SubscribeId DESC) as RowNumber
        From billing.BillMaster As BM  
        Where  
        ( Bm.SubscribeId = '12345674' )  
        Order by SubscribeId  
        OFFSET @PageNumber * @RowCount ROWS  
        FETCH NEXT @RowCount ROWS ONLY;
    

    【讨论】:

    • 这不是一个好的答案。例如,如果我没有分页的查询有 100 行,并且我想查看有 10 行的第二页,我将有 11 到 20 之间的行,但我还需要数字 100 来创建 10 个可能的分页。
    【解决方案2】:

    这是我的解决方案:

    Select
      COUNT() OVER ( ORDER BY (SELECT NULL)) as RowNumber,
        * 
    From billing.BillMaster As BM  
    Where  
    ( Bm.SubscribeId = '12345674' )  
    Order by SubscribeId  
    OFFSET (@PageNumber - 1) * @RowCount ROWS  
    FETCH NEXT @RowCount ROWS ONLY; 
    

    【讨论】:

      猜你喜欢
      • 2012-07-13
      • 2013-07-31
      • 2018-03-04
      • 2011-04-26
      • 1970-01-01
      • 2020-02-28
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      相关资源
      最近更新 更多