Função com valor de tabela com CTE Recursiva

0

Pergunta

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?

1

Melhor resposta

0

Eu acho que esta pode ser a resposta.

Na resposta a outra pergunta, @GarethD estados:

Se você pensar de uma vista mais como uma subconsulta que uma consulta armazenada ... e lembre-se de que a sua definição é expandida para a consulta principal ...

(Sintaxe incorreta Próximo a Palavra-chave 'OPÇÃO' no CTE Instrução).

Se for esse o caso, um modo de exibição pode não incluir nada que não podem ser incluídas em uma subconsulta. Que inclui o ORDER BY cláusula e dicas de como OPTION.

Eu ainda não tenho certeza, mas eu acho que o mesmo vale para uma Função com valor de Tabela. Se assim for, a resposta é não, não há nenhuma maneira de incluir o OPTION cláusula.

Observe que outros Sgbds são mais confortáveis do que pode ser incluído em subconsultas, então não creio que eles têm as mesmas limitações.

2021-11-28 09:29:14

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................