Maison >base de données >tutoriel mysql >Comment puis-je sélectionner efficacement un nombre spécifique de lignes dans SQL Server, même au-delà de la limite sys.all_columns ?

Comment puis-je sélectionner efficacement un nombre spécifique de lignes dans SQL Server, même au-delà de la limite sys.all_columns ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-28 16:13:05796parcourir

How Can I Efficiently Select a Specific Number of Rows in SQL Server, Even Beyond the sys.all_columns Limit?

Sélection d'un nombre spécifique de lignes dans SQL Server

Dans SQL Server, la sélection d'un nombre spécifique de lignes peut être obtenue à l'aide de la fonction ROW_NUMBER(). Cependant, il existe des limites au nombre de lignes pouvant être renvoyées.

La limitation Sys.Columns

La requête initiale fournie ne spécifie pas de table spécifique dans laquelle sélectionner les lignes. Lors de l'exécution de cette requête sur sys.all_columns, elle ne renverra que jusqu'à 7 374 lignes, car il s'agit du nombre total de lignes dans cette table.

Approches alternatives

Pour sélectionner un plus grand nombre de lignes , des méthodes alternatives peuvent être utilisées :

Utiliser un numéro Tableau :

DECLARE @start INT = 1;
DECLARE @end INT = 10;

WITH numbers AS (
    SELECT @start AS number
    UNION ALL
    SELECT number + 1 
    FROM  numbers
    WHERE number < @end
)
SELECT *
FROM numbers
OPTION (MAXRECURSION 0);

En utilisant un tableau numérique, un nombre infini de lignes peut être généré. Cependant, cette approche peut être relativement lente.

CTE en cascade pour une table de pointage

Pour améliorer les performances, des CTE en cascade peuvent être utilisés pour 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

Cette approche est capable de générer un grand nombre de lignes avec zéro lecture. Pour plus de comparaisons de performances et de détails supplémentaires sur les tableaux de pointage, reportez-vous aux liens fournis dans la réponse.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn