sql >> Database >  >> RDS >> Sqlserver

N rijen selecteren in SQL Server

Zoals eerder opgemerkt, is dit omdat je het aantal rijen van sys.columns hebt bereikt . Hier is een andere manier om een ​​lijst met nummers te genereren of wat anderen Numbers Table noemen of Tally Table .

Dit maakt gebruik van trapsgewijze CTE s en zou de snelste manier zijn om een ​​Tally Table te maken:

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

U kunt gemakkelijk nog een CTE toevoegen als u meer dan 10.000 rijen nodig heeft.

Lees voor meer informatie over Tally Table dit uitstekende artikel door Jeff Moden.

Lees dit . voor prestatievergelijkingen tussen manieren om tallytabellen te genereren .

Uitleg uit Jeff's artikel:

De CTE genaamd E1 (zoals in 10E1 voor wetenschappelijke notatie) is niets meer dan tien SELECT 1 wordt geretourneerd als een enkele resultaatset.

E2 doet een CROSS JOIN van E1 met zichzelf. Dat retourneert een set met één resultaat van 10*10 of maximaal 100 rijen. Ik zeg "tot" want als deTOP-functie 100 of minder is, zijn de CTE's "slim" genoeg om te weten dat het eigenlijk niet verder hoeft te gaan en E4 en E8 komt niet eens in het spel. Als de TOP heeft een waarde van minder dan 100, niet alle 100 rijen die E2 kan maken zal worden gemaakt. Het zal altijd net genoeg maken volgens de TOP functie.

Van daaruit kun je volgen. E4 is een CROSS JOIN van E2 en zal tot 100*100 of 10.000 rijen maken en E8 is een CROSS JOIN van E4 die meer rijen zal maken dan de meeste mensen ooit nodig zullen hebben. Als je meer gedaan hebt, voeg dan gewoon een E16 toe als een CROSS JOIN van E8 en verander de laatste FROM clausule naar FROM E16 .

Wat echt geweldig is aan deze slechterik, is dat hij ZEROREADS . produceert . Absoluut geen, nada, nul.



  1. Waarom retourneert ISNUMERIC('.') 1?

  2. Oracle subquery grappig

  3. MySQL op Docker - Hoe u uw database kunt containeriseren:nieuwe whitepaper

  4. Varchar(MAX) versus TEXT gebruiken op SQL Server