Requête 1 :
DECLARE @Range AS INT = 10 ;WITH CTE AS( SELECT TOP (@Range) Duration = ROW_NUMBER() OVER(ORDER BY OBJECT_ID) FROM sys.all_columns ORDER BY [Object_id] ) SELECT Duration from CTE
Explication :
Cette requête est limitée par le nombre de lignes dans sys.all_columns tableau. Par conséquent, définir @Range sur 10 000 ne renverra que 7 374 lignes, car il s'agit du nombre de lignes dans sys.all_columns.
Requête 2 :
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);
Explication :
Cette requête alternative utilise une requête récursive expression de table commune (CTE) pour générer une table de nombres de @start à @end. L'OPTION (MAXRECURSION 0) est nécessaire pour éviter les erreurs de récursion lors de la création d'une table avec un nombre illimité de lignes.
Solution CTE en cascade :
Explication :
Une approche CTE en cascade est le moyen le plus rapide de créer une « table de pointage » pour un grand nombre de lignes.
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
Avantages du CTE en cascade :
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!