web-dev-qa-db-ja.com

SQL Server 2012でページングと共に合計数を取得するためのより良い方法

ページングとともにレコードの総数を取得する必要があります。現在、SQL Server 2012で以下のように実行しています。カウントを取得するには、別のクエリが必要です。 SQL Server 2012で改善された方法はありますか?

ALTER PROCEDURE dbo.tpGetPageRecords
(
    @OffSetRowNo INT,     
    @FetchRowNo INT,
    @TotalCount INT OUT
) 
AS 

SELECT CSTNO, CSTABBR 
FROM DBATABC
WHERE CSTABBR LIKE 'A%'
ORDER BY CSTNO
OFFSET ( @OffSetRowNo-1 ) * @FetchRowNo ROWS
FETCH NEXT @FetchRowNo ROWS ONLY

SET @TotalCount = 
(SELECT COUNT(*)
FROM DBATABC
WHERE CSTABBR LIKE 'A%')


GO
20
LCJ

契約の変更が許可されている場合は、次のことが可能です。

SELECT CSTNO, CSTABBR,COUNT(*) OVER () as TotalCount
FROM DBATABC
WHERE CSTABBR LIKE 'A%'
ORDER BY CSTNO
OFFSET ( @OffSetRowNo-1 ) * @FetchRowNo ROWS
FETCH NEXT @FetchRowNo ROWS ONLY

そして、合計は結果セットの個別の列として利用可能になります。残念ながら、この同じステートメントでこの値を変数に割り当てる方法はないため、OUTパラメーターとして提供することはできません。

これは OVER (2005年から利用可能)を使用して、GROUPingを必要とせずに、(無制限の)結果セット全体に対して集計を計算できるようにします。

38