Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Sélection de N lignes dans SQL Server

Comme indiqué précédemment, c'est parce que vous avez atteint le nombre de lignes de sys.columns . Voici une autre façon de générer une liste de nombres ou ce que d'autres appellent Numbers Table ou Tally Table .

Cela utilise CTE en cascade s et est considéré comme le moyen le plus rapide de créer une table de pointage :

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

Vous pouvez facilement ajouter un autre CTE si vous avez besoin de plus de 10 000 lignes.

Pour plus d'informations sur Tally Table, lisez cet excellent article par Jeff Moden.

Pour des comparaisons de performances entre les façons de générer des tableaux de pointage, lisez ceci .

Explication tirée de l'article de Jeff :

Le CTE appelé E1 (comme dans 10E1 pour la notation scientifique) n'est rien de plus que dix SELECT 1 est renvoyé sous la forme d'un ensemble de résultats unique.

E2 fait un CROSS JOIN de E1 avec lui-même. Cela renvoie un ensemble de résultats unique de 10*10 ou jusqu'à 100 lignes. Je dis "jusqu'à" car si la fonction TOP est de 100 ou moins, les CTE sont suffisamment "intelligents" pour savoir qu'il n'est pas nécessaire d'aller plus loin et E4 et E8 n'entreront même pas en jeu. Si le TOP a une valeur inférieure à 100, pastoutes les 100 lignes que E2 est capable de faire sera fait. Ça fera toujours juste assez selon le TOP fonction.

Vous pouvez suivre à partir de là. E4 est une CROSS JOIN de E2 et fera jusqu'à 100*100 ou 10 000 lignes et E8 est une CROSS JOIN de E4 ce qui fera plus de rangées que la plupart des gens n'en auront jamais besoin. Si vous en avez fait plus, ajoutez simplement un E16 en tant que CROSS JOIN de E8 et changez le FROM final clause à FROM E16 .

Ce qui est vraiment incroyable avec ce bad-boy, c'est qu'il produit des ZEROREADS . Absolument aucun, nada, néant.