SQL Server や T-SQL を初めて学ぶ人のための学習サイトです。 便利なクエリーやチューニングの仕方なども掲載しています。
SQL Server 入門
T-SQL 入門
便利なT-SQL&クエリー集
SQL Server&T-SQLに関するコラム
サイト情報
MCTS: SQL Server 2008, Database Development
サイト内検索
カスタム検索
ホーム > 便利なT-SQL&クエリー集 > SQL で動的に連番テーブルを生成する

SQL で動的に連番テーブルを生成する

SQL で動的に連番テーブルを生成するには?

以下のように、単純に 1 から順番に、ある特定の数までの連番を持つテーブルを動的に生成したい時ありませんか?

SQL で動的に連番テーブルを生成する 1

動的に連番を生成する方法はいろいろありますが、今回は 1 から 100 までの連番を簡単に生成する 2 つの方法をご紹介します。

sys.all_objects を利用して連番を生成する方法

まずは sys.all_objects を利用して、連番を生成する方法です。

DECLARE @Count INT = 100;

SELECT   TOP (@Count)
         ROW_NUMBER() OVER (ORDER BY object_id) AS SeqNo
FROM     sys.all_objects
ORDER BY SeqNo;

SQL で動的に連番テーブルを生成する 2

確実にレコードが存在するであろうテーブルを利用して、キー順に ROW_NUMBER を振って、連番テーブルを生成しています。

sys.all_objects はシステムオブジェクトやユーザーが定義したオブジェクト等を保持している、オブジェクトカタログビューで、SQL Server のコアなビューなので、バージョンがあがっても簡単になくなったりする心配はないと思います。

ですが、sys.all_objects のデフォルトのレコード数は、SQL Server のバージョンによっても違いますが、だいたい 2000 前後なので、あまり大きいを生成するのには使えませんので気をつけてください。


共通テーブル式:CTE (Common Table Expression) を使って連番を生成する方法

次は共通テーブル式 (CTE) を使用する再起クエリー使って連番を生成する方法です。

DECLARE @Count   INT = 100;

;WITH NumberTable (SeqNo)
AS
(
     SELECT 1
     UNION ALL
     SELECT 1 + SeqNo
     FROM   NumberTable
     WHERE  SeqNo < @Count
)
SELECT  SeqNo
FROM    NumberTable
OPTION (MAXRECURSION 0);

SQL で動的に連番テーブルを生成する 3

以前ご紹介した 「 日付範囲から日ごとのデータを作成する 」 クエリーとほぼ同じです。

クエリーヒントの MAXRECURSION を使って、再起を繰り返す回数を指定することができ、ここでは 0 (無制限)を指定しています。

この方法は、数に上限はありませんが、@Count があまり大きな数になると、パフォーマンスが悪くなりますのでご注意くださいね!


最後に、連番テーブルの使用頻度が高かったり、大きな数の連番が必要だったりする際には、動的に作らず、連番用のテーブルを作っておいて利用するほうが良いと思います。



ホーム > 便利なT-SQL&クエリー集 > SQL で動的に連番を生成する

© 2014 SQL Server 入門