sql >> データベース >  >> RDS >> Sqlserver

SQLServerでN行を選択する

    前にコメントしたように、これは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のように)10 SELECT 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。



    1. 名前付きインスタンスを使用していますか? DAC接続をテストしてください!

    2. Microsoft Access 2010、2013、2016、および2019を使用した構造化照会言語(SQL)の操作

    3. SQLServer2005でのデッドロックの診断

    4. LIKE式で安全に使用できるように、SQLServerで文字列をエスケープします