前にコメントしたように、これは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
にすぎません は単一の結果セットとして返されます。
E2
CROSS JOIN
を実行しますE1
の それ自体で。これは、10*10または最大100行の単一の結果セットを返します。 TOP関数が100以下の場合、CTEは「スマート」であり、実際にはそれ以上進む必要がないことを認識し、E4
であるため、「最大」と言います。 およびE8
場に出ることさえありません。TOP
の場合 値が100未満であり、E2
の100行すべてではありません 作ることができるようになります。TOP
に応じて常に十分に作成されます 機能。そこからフォローできます。
E4
CROSS JOIN
ですE2
の 最大100*100または10,000行とE8
を作成しますCROSS JOIN
ですE4
の これにより、ほとんどの人が必要とするよりも多くの行が作成されます。さらに多くのことを行った場合は、E16
を追加するだけです。CROSS JOIN
としてE8
の 最後のFROM
を変更しますFROM E16
の句 。このバッドボーイの本当に素晴らしい点は、 ZEROREADSを生成することです。 。絶対にありません、nada、nil。