SQLServerで結果レコードを分割する

データベースSQLServer,データベース

記事内に広告が含まれています。

SQLServerで結果レコードを分割する方法を紹介します。

コーディング例

BEGIN
    CREATE TABLE #WRK_TABLE(
        Number INT
    );
    WITH
        TMP AS (
            SELECT
                1 AS Number
            UNION ALL
            SELECT
                Number + 1 AS Number
            FROM
                TMP
            WHERE
                Number < 10
        )
    INSERT INTO #WRK_TABLE
    SELECT
        Number
    FROM
        TMP
    ;

    DECLARE @PageNo   INT = 0;
    DECLARE @RowCount INT = 3;
    WHILE 1 = 1
    BEGIN
        SELECT
            Number
        FROM
            #WRK_TABLE
        ORDER BY
            Number
        OFFSET (@PageNo * @RowCount) ROWS
        FETCH NEXT @RowCount ROWS ONLY
        ;

        IF @@ROWCOUNT = 0 BREAK;

        SET @PageNo = @PageNo + 1;
    END

    DROP TABLE #WRK_TABLE;
END

実行結果

Number
1
2
3
Number
4
5
6
Number
7
8
9
Number
10
Number

2~22行目で一時テーブル#WRK_TABLEを作成し、1~10のレコードを追加しています。
24行目の変数@PageNoにはページ数、25行目の変数@RowCountには1ページで抽出する件数を指定しています。
26行目のWHILE文で条件を「1 = 1」としていることで無限ループを開始しています。
28~36行目のSELECT文で3レコードずつ出力しているのですが、34行目のOFFSET句で読み飛ばすレコード数を指定しており、35行目のFETCH NEXT句で抽出するレコード数を指定しています。
初回のループでは「OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY」となり、先頭レコードから3レコードを抽出します。38行目の@@ROWCOUNTには直前のSQLで抽出されたレコード数「3」がセットされており、「@@ROWCOUNT = 0」ではないためスキップし、40行目で@PageNoをカウントアップしています。
2回目のループでは「OFFSET 3 ROWS FETCH NEXT 3 ROWS ONLY」となり、先頭から3レコードをスキップし、4レコード目から3レコード分を抽出します。
5回目のループでは「OFFSET 12 ROWS FETCH NEXT 3 ROWS ONLY」となり、抽出レコードが0件となりますので、38行目の「@@ROWCOUNT = 0」の条件を満たすため、WHILE文を抜けます。

以上、SQLServerで結果レコードを分割する方法のご紹介でした。

システムトラストでは一緒に働いていただける仲間を募集中です。
株式会社システムトラスト

システムトラストでは、システムエンジニア、プログラマーなどを随時募集中です。気軽にご相談ください。

お問合せ