Je me rends compte que c'est un vieux fil, mais je dois admettre ma consternation devant la surabondance de solutions récursives et en boucle données ici. Je me demande combien de personnes réalisent que la récursivité n'est rien de plus qu'une boucle très coûteuse ? Je comprends le désir de créer une fonction table, mais je suggère que ce qui suit est beaucoup plus efficace car il est basé sur des ensembles, sans boucle, récursivité ou instructions d'insertion simples répétées :
CREATE FUNCTION dbo.GenerateDateRange(@StartDate AS DATE, @EndDate AS DATE)
RETURNS TABLE WITH SCHEMABINDING AS
WITH e1(n) AS (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) AS x(n)) -- 16 records
,e2(n) AS (SELECT 1 FROM e1 a CROSS JOIN e1 b) -- 16^2 or 256 records (16*16)
,cteTally(n) AS (SELECT ROW_NUMBER() over (ORDER BY 1) AS n FROM e2 a CROSS JOIN e2 b) -- 16^4 or 65,536 records (256*256)
SELECT DATEADD(DAY, n-1, @StartDate)
FROM cteTally
WHERE n <= DATEDIFF(DAY, @StartDate, @EndDate) + 1;
GO