sql >> Database teknologi >  >> RDS >> Sqlserver

Valg af N rækker i SQL Server

Som tidligere nævnt er det fordi du har nået antallet af rækker af sys.columns . Her er en anden måde at generere en liste over numre eller hvad andre kalder Numbers Table eller Tally Table .

Dette bruger cascaded CTE s og siges at være den hurtigste måde at oprette en Tally Table på:

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

Du kan nemt tilføje endnu en CTE, hvis du har brug for mere end 10.000 rækker.

For mere information om Tally Table, læs denne fremragende artikel af Jeff Moden.

Læs dette for at få præstationssammenligninger mellem måder at generere Tally-tabeller på .

Forklaring taget fra Jeffs artikel:

CTE kaldet E1 (som i 10E1 for videnskabelig notation) er intet mere end ti SELECT 1 's returneres som et enkelt resultatsæt.

E2 laver en CROSS JOIN af E1 med sig selv. Det returnerer et enkeltresultatsæt på 10*10 eller op til 100 rækker. Jeg siger "op til", fordi hvis TOP-funktionen er 100 eller mindre, er CTE'erne "smarte" nok til at vide, at de faktisk ikke behøver at gå længere og E4 og E8 vil ikke engang komme i spil. Hvis TOP har en værdi på mindre end 100, ikke alle 100 rækker, der E2 er i stand til at lave vil blive lavet. Det vil altid give lige nok i henhold til TOP funktion.

Du kan følge med derfra. E4 er en CROSS JOIN af E2 og vil udgøre op til 100*100 eller 10.000 rækker og E8 er en CROSS JOIN af E4 hvilket vil lave flere rækker, end de fleste nogensinde har brug for. Hvis du har gjort mere, skal du blot tilføje en E16 som en CROSS JOIN af E8 og ændre den endelige FROM klausul til FROM E16 .

Det, der virkelig er fantastisk ved denne dårlige dreng, er, at den producerer ZEROREADS . Absolut ingen, nada, nul.



  1. Sådan kører du SQL Server 2017 og 2019 samtidigt på en Mac

  2. Bed dine brugere om at gå i gaffel

  3. Opdater data via en funktion med tabelværdi i SQL Server

  4. Eksempler på konvertering af 'dato' til 'datetime offset' i SQL Server (T-SQL)