前にコメントしたように、これはsys.columnsの行数に達したためです。 。番号のリストまたは他の人がNumbers Tableと呼ぶものを生成する別の方法は次のとおりです。 またはTally Table 。
これはカスケードされたCTEを使用します ■タリーテーブルを作成する最速の方法と言われています:
DECLARE @Range AS INT = 7374
;WITH E1(N) AS( -- 10 ^ 1 = 10 rows
SELECT 1 FROM(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(N)
),
E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), -- 10 ^ 2 = 100 rows
E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), -- 10 ^ 4 = 10,000 rows
E8(N) AS(SELECT 1 FROM E4 a CROSS JOIN E4 b), -- 10 ^ 8 = 10,000,000 rows
CteTally(N) AS(
SELECT TOP(@Range) ROW_NUMBER() OVER(ORDER BY(SELECT NULL))
FROM E8
)
SELECT * FROM CteTally
10,000行を超える行が必要な場合は、別のCTEを簡単に追加できます。
Tally Tableの詳細については、この優れた記事をご覧ください。 ジェフ・モデンによる。
タリーテーブルを生成する方法間のパフォーマンスの比較については、こちらをお読みください。 。
ジェフの記事からの説明:
E1と呼ばれるCTE (科学的記数法の10E1のように)10SELECT 1にすぎません は単一の結果セットとして返されます。
E2CROSS JOINを実行しますE1の それ自体で。これは、10*10または最大100行の単一の結果セットを返します。 TOP関数が100以下の場合、CTEは「スマート」であり、実際にはそれ以上進む必要がないことを認識し、E4であるため、「最大」と言います。 およびE8場に出ることさえありません。TOPの場合 値が100未満であり、E2の100行すべてではありません 作ることができるようになります。TOPに応じて常に十分に作成されます 機能。そこからフォローできます。
E4CROSS JOINですE2の 最大100*100または10,000行とE8を作成しますCROSS JOINですE4の これにより、ほとんどの人が必要とするよりも多くの行が作成されます。さらに多くのことを行った場合は、E16を追加するだけです。CROSS JOINとしてE8の 最後のFROMを変更しますFROM E16の句 。このバッドボーイの本当に素晴らしい点は、 ZEROREADSを生成することです。 。絶対にありません、nada、nil。