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

Selezione di N righe in SQL Server

Come commentato in precedenza, è perché hai raggiunto il numero di righe di sys.columns . Ecco un altro modo per generare un elenco di numeri o ciò che altri chiamano Numbers Table o Tally Table .

Questo utilizza CTE a cascata se si dice che sia il modo più veloce per creare una tabella Tally:

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

Puoi facilmente aggiungere un altro CTE se hai bisogno di più di 10.000 righe.

Per ulteriori informazioni su Tally Table, leggi questo eccellente articolo di Jeff Moden.

Per confrontare le prestazioni tra i modi per generare tabelle di conteggio, leggi questo .

Spiegazione tratta dall'articolo di Jeff:

Il CTE ha chiamato E1 (come in 10E1 per la notazione scientifica) non è altro che dieci SELECT 1 ' viene restituito come un unico set di risultati.

E2 fa un CROSS JOIN di E1 con se stesso. Ciò restituisce un set di risultati singoli di 10*10 o fino a 100 righe. Dico "fino a" perché se la funzione TOP è 100 o meno, i CTE sono abbastanza "intelligenti" da sapere che in realtà non è necessario andare oltre e E4 e E8 non entrerà nemmeno in gioco. Se il TOP ha un valore inferiore a 100, non tutte le 100 righe che E2 è capace di fare sarà fatto. Farà sempre quel tanto che basta secondo il TOP funzione.

Puoi seguire da lì. E4 è un CROSS JOIN di E2 e farà fino a 100*100 o 10.000 righe e E8 è un CROSS JOIN di E4 che creerà più righe di quante la maggior parte delle persone avrà mai bisogno. Se hai fatto di più, aggiungi semplicemente un E16 come CROSS JOIN di E8 e cambia il FROM finale clausola a FROM E16 .

La cosa davvero sorprendente di questo ragazzaccio è che produce ZEROREADS . Assolutamente nessuno, niente, niente.