Funzione con valori di tabella con CTE Ricorsiva

0

Domanda

Solo per divertimento, sto cercando di scrivere una funzione con valori di tabella per creare una tabella di date. Per scopi di test, io sono hard-codifica i valori che devono essere passati in variabili.

Di per sé, questo funziona:

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 il OPTION alla fine.

Come una funzione, non funzionerà a meno che io non rimuovere il OPTION clausola alla fine:

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)
;

Per i dati di test, che è OK, ma sarà certamente fallire se posso dare è data all'inizio dell'anno, poiché coinvolge più di 100 ricorsioni.

C'è una sintassi corretta per questo, o è un'altra Microsoft Peculiarità che ha bisogno di una soluzione alternativa?

1

Migliore risposta

0

Io penso che questa potrebbe essere la risposta.

In una risposta ad un'altra domanda, @GarethD stati:

Se si pensa ad una vista più come una stored sottoquery di una stored query ... e ricorda che la sua definizione è ampliato nella query principale ...

(Sintassi non corretta in Prossimità della parola Chiave 'OPZIONE' nel CTE Istruzione).

Se questo è il caso, vista non può includere qualsiasi cosa, che non possono essere incluse in una sottoquery. Che include la ORDER BY clausola e suggerimenti come OPTION.

Devo ancora verificare, ma credo che lo stesso vale per una Funzione con valori di Tabella. Se è così, la risposta è no, non c'è modo di includere il OPTION clausola.

Nota che altri Dbms sono più accomodante in cosa può essere incluso nella sottoquery, così non posso immaginare che essi hanno le stesse limitazioni.

2021-11-28 09:29:14

In altre lingue

Questa pagina è in altre lingue

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