Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Auswählen von N Zeilen in SQL Server

Wie bereits erwähnt, liegt dies daran, dass Sie die Anzahl der Zeilen von sys.columns erreicht haben . Hier ist eine andere Möglichkeit, eine Liste mit Zahlen zu erstellen, oder was andere als Numbers Table bezeichnen oder Tally Table .

Dies verwendet kaskadierten CTE s und soll der schnellste Weg sein, eine Tally Table zu erstellen:

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

Sie können problemlos einen weiteren CTE hinzufügen, wenn Sie mehr als 10.000 Zeilen benötigen.

Weitere Informationen zu Tally Table finden Sie in diesem hervorragenden Artikel von Jeff Moden.

Für Leistungsvergleiche zwischen Möglichkeiten zum Generieren von Tally-Tabellen lesen Sie dies .

Erklärung aus Jeffs Artikel:

Der CTE namens E1 (wie in 10E1 für die wissenschaftliche Notation) ist nichts weiter als zehn SELECT 1 wird als einzelne Ergebnismenge zurückgegeben.

E2 macht einen CROSS JOIN von E1 mit sich. Das gibt einen einzelnen Ergebnissatz von 10*10 oder bis zu 100 Zeilen zurück. Ich sage „bis zu“, denn wenn die TOP-Funktion 100 oder weniger beträgt, sind die CTEs „intelligent“ genug, um zu wissen, dass sie eigentlich nicht weiter gehen müssen und E4 und E8 wird gar nicht ins Spiel kommen. Wenn der TOP einen Wert von weniger als 100 hat, nicht alle 100 Zeilen, die E2 in der Lage ist, wird gemacht werden. Laut TOP wird es immer gerade genug sein Funktion.

Von dort aus können Sie folgen. E4 ist ein CROSS JOIN von E2 und macht bis zu 100*100 oder 10.000 Zeilen und E8 ist ein CROSS JOIN von E4 was mehr Reihen machen wird, als die meisten Menschen jemals brauchen werden. Wenn Sie mehr getan haben, dann fügen Sie einfach ein E16 hinzu als CROSS JOIN von E8 und ändern Sie das abschließende FROM -Klausel zu FROM E16 .

Das wirklich Erstaunliche an diesem Bad Boy ist, dass er ZEROREADS produziert . Absolut keine, nada, nil.