sql >> Databasteknik >  >> RDS >> Sqlserver

Väljer N rader i SQL Server

Som kommenterat tidigare beror det på att du nådde antalet rader i sys.columns . Här är ett annat sätt att skapa en lista med nummer eller vad andra kallar Numbers Table eller Tally Table .

Detta använder kaskadad CTE s och sägs vara det snabbaste sättet att skapa en Tally-tabell:

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 enkelt lägga till ytterligare en CTE om du behöver fler än 10 000 rader.

För mer information om Tally Table, läs denna utmärkta artikel av Jeff Moden.

Läs det här för prestandajämförelser mellan olika sätt att generera Tally-tabeller .

Förklaring hämtad från Jeffs artikel:

CTE kallas E1 (som i 10E1 för vetenskaplig notation) är inget mer än tio SELECT 1 's returneras som en enda resultatuppsättning.

E2 gör en CROSS JOIN av E1 med sig själv. Det returnerar en enstaka resultatuppsättning på 10*10 eller upp till 100 rader. Jag säger "upp till" för om TOP-funktionen är 100 eller mindre är CTE:erna tillräckligt "smarta" för att veta att de faktiskt inte behöver gå längre och E4 och E8 kommer inte ens att spela in. Om TOP har ett värde på mindre än 100, inte alla 100 rader som E2 är kapabel att göra kommer att göras. Det kommer alltid att tjäna precis tillräckligt enligt TOP funktion.

Du kan följa därifrån. E4 är en CROSS JOIN av E2 och kommer att göra upp till 100*100 eller 10 000 rader och E8 är en CROSS JOIN av E4 vilket kommer att skapa fler rader än de flesta någonsin kommer att behöva. Om du har gjort mer, lägg bara till en E16 som en CROSS JOIN av E8 och ändra den sista FROM klausul till FROM E16 .

Det som verkligen är fantastiskt med den här badboyen är att den producerar ZEROREADS . Absolut ingen, nada, noll.



  1. MySQL SELECT WHERE datetime matchar dag (och inte nödvändigtvis tid)

  2. VBA Base Class och härledda objekt-2

  3. TABLOCK vs TABLOCKX

  4. The Eager Index Spool och The Optimizer