Apenas por diversão, eu estou tentando escrever uma função com valor de tabela para gerar uma tabela de datas. Para fins de teste, eu sou difícil de codificação de valores que devem ser passados em variáveis.
Por si só, isso funciona:
WITH cte AS (
SELECT cast('2021-10-01' AS date) AS date
UNION ALL
SELECT dateadd(day,1,date) FROM cte WHERE date<current_timestamp
)
SELECT * FROM cte OPTION(maxrecursion 0);
Nota o OPTION
no final.
Como uma função, ele não vai funcionar a menos que eu remover o OPTION
cláusula final:
CREATE FUNCTION dates(@start date, @rows INT) RETURNS TABLE AS
RETURN
WITH cte AS (
SELECT cast('2021-10-01' AS date) AS date
UNION ALL
SELECT dateadd(day,1,date) FROM cte WHERE date<current_timestamp
)
SELECT * FROM cte -- OPTION(maxrecursion 0)
;
Para os dados de teste, que é OK, mas certamente irá falhar se eu der a data no início do ano, uma vez que envolve mais de 100 recursões.
Existe uma sintaxe correta para isso, ou é outro o Microsoft Peculiaridade que precisa de uma solução?