1

ここの記事とSOの専門家からの最近の回答の助けを借りて、一連のレコードを効率的にページングするのに役立つ次の情報にたどり着きました。

私の最後のいくつかの質問は

  1. Total Number of Records'Total' という SQL CTE の末尾にあるペイロードにを含める方法を参照してください。それはあなたがこれを行う方法ですか?
  2. 他の提案はありますか?より簡潔にする、または改善する可能性のある領域はありますか?Return Total Number of Pages

DECLARE @page_size INT = 5;
DECLARE @page_nbr INT = 4;
DECLARE @search NVARCHAR(MAX) = '';
DECLARE @sort_order INT = 2;

WITH AllProducts
AS
(
SELECT *, 
CASE @sort_order
    WHEN 1 THEN ROW_NUMBER() OVER ( ORDER BY ProductID )
    WHEN 2 THEN ROW_NUMBER() OVER ( ORDER BY ProductName )
END AS 'Seq'    
FROM Products
),
Filtered
AS
(
SELECT * FROM AllProducts
WHERE ProductName like '%'+@search+'%'
OR
@search is null
)
SELECT (select COUNT(*) from Filtered) as 'Total', * FROM Filtered
WHERE seq > (@page_nbr - 1) * @page_size
  AND seq <= @page_nbr * @page_size
4

1 に答える 1

1

クエリに何か問題があると思います。(ページングのために) レコードに番号を付け、その後フィルターを適用します。

たとえば、レコードのページ 2 を要求することは可能ですが、その間、対応する値を持つすべてのレコードseqが除外される可能性があります。そのため、この場合、テーブルに多数のレコードが存在する可能性がありますが、クエリは結果を生成しません。

これを修正するには、次のように、同じ CTE でフィルタリングとレコードの番号付けを行うことができます。

DECLARE @page_size INT = 5;
DECLARE @page_nbr INT = 4;
DECLARE @search NVARCHAR(MAX) = '';
DECLARE @sort_order INT = 2;

WITH Filtered AS (
    SELECT *, 
        CASE @sort_order
            WHEN 1 THEN ROW_NUMBER() OVER ( ORDER BY ProductID )
            WHEN 2 THEN ROW_NUMBER() OVER ( ORDER BY ProductName )
        END AS 'Seq'
    FROM AllProducts
    WHERE ProductName like '%'+@search+'%' OR @search is null
)
SELECT (select COUNT(*) from Filtered) as 'Total', * FROM Filtered
WHERE seq > (@page_nbr - 1) * @page_size
  AND seq <= @page_nbr * @page_size
于 2012-11-03T18:18:00.580 に答える