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
しかし、この方法でわかるように、ページングなしでメイン選択に大量のデータがある場合、非常に遅くなる可能性がある物理一時テーブルを使用しています。
誰かがそれを行うための最良の方法を教えてもらえますか?