0

SQL Server 2012 を使用しています。ストアド プロシージャでページングを行う必要があります。クライアント側(Webページ)では、要求されたページのストアドプロシージャの結果が必要であり、その条件でページ数を設定するには、ページ数を考慮せずに行数を取得する必要があります。

たとえば、SubscribeId が 12345674 の場合、2 ページ目の 10 行をクエリするには、このストアド プロシージャを実行する必要があります。

Create Procedure TestSelectBill  
    (@PageNumber int = 1 ,  
     @RowCount int = 10  ,
     @SubscribeId Int = 0)  
As  
Begin  
    Select *  
    From billing.BillMaster As BM  
    Where (Bm.SubscribeId = @SubscribeId)  
    Order by SubscribeId  
        Offset (@PageNumber - 1) * @RowCount Rows 
        Fetch Next @RowCount Rows Only;  
End  

このストアド プロシージャを次のように実行する必要があります。

Execute TestSelectBill  
        @PageNumber = 2, @RowCount int = 10, @SubscribeId = 12345674

billing.BillMasterこのに 105 行あると想像してくださいSubscribeId = 123456574。ここで、結果としてエンド ユーザーに 10 行を表示する必要があり、1 から 11 の間で 1 ページを選択できるようにする必要があります。

つまり、この条件に対して何行存在するかを知る必要がありますSubscribeId = 123456574

以下のコードのようにストアド プロシージャを変更して、行数を返すことができます。

Create Procedure TestSelectBill  
    (@PageNumber int = 1,  
     @RowCount int = 10,
     @SubscribeId Int = 0)  
As  
Begin  
    DECLARE @ROW_COUNT INT = 0

    -- Find Row Count for this condition
    Select   
        @ROW_COUNT = COUNT(*)  
    From 
        billing.BillMaster As BM  
    Where  
        (Bm.SubscribeId = @SubscribeId)  

    -- Select Result
    SELECT
        Row_Count = @ROW_COUNT,    
        *  
    FROM
        billing.BillMaster As BM  
    WHERE
        (Bm.SubscribeId = @SubscribeId)  
    ORDER BY
        SubscribeId  
        OFFSET ( @PageNumber - 1 ) * @RowCount ROWS  
        FETCH NEXT @RowCount ROWS ONLY;  
End  

しかし、ご覧のとおり、select を 2 回記述する必要があり、このストアド プロシージャの変更と保守が非常に複雑になるため、これは適切ではありません。

また、結果を一時テーブルに保存して、以下のコードのように使用できます。

CREATE Procedure TestSelectBill  
    (@PageNumber int = 1,  
     @RowCount int = 10,
     @SubscribeId Int = 0)  
As  
Begin  
    DECLARE @ROW_COUNT INT = 0

    -- Main Select 
    SELECT                      
        *  
    FROM 
        billing.BillMaster As BM  
    INTO 
        #T
    WHERE
        (Bm.SubscribeId = @SubscribeId)  

    -- Find Row Count for this condituion
    SELECT @ROW_COUNT = COUNT(*)  
    FROM #T

    -- Select Result
    SELECT
        Row_Count = @ROW_COUNT, 
        *  
    FROM
        #T
    ORDER BY 
        SubscribeId  
        OFFSET (@PageNumber - 1) * @RowCount ROWS  
        FETCH NEXT @RowCount ROWS ONLY;  
End  

しかし、この方法でわかるように、ページングなしでメイン選択に大量のデータがある場合、非常に遅くなる可能性がある物理一時テー​​ブルを使用しています。

誰かがそれを行うための最良の方法を教えてもらえますか?

4

2 に答える 2

0

挿入された行ごとに 1 ずつ増加する ID 列を持つ一時テーブルを作成し、その列の最大値を読み取って行数を取得できます。

于 2016-11-24T05:11:34.853 に答える