Stolní Cenil Funkce s Rekurzivní CTE

0

Otázka

Jen tak pro zábavu, snažím se napsat stolní cenil funkce generovat tabulku data. Pro účely testování jsem hard-kódování hodnoty, které by měly být předány v proměnné.

Samo o sobě to funguje:

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

Poznámka: OPTION na konci.

Jako funkci, nebude to fungovat, pokud jsem odstranit OPTION klauzule na konci:

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

Pro testovací data, to je v POŘÁDKU, ale to se jistě nepodaří, když jsem se dát to datum na začátku roku, protože to zahrnuje více než 100 recursions.

Je tu správnou syntaxi pro tento, nebo je to další Microsoft Vtípek, který potřebuje řešení?

1

Nejlepší odpověď

0

Myslím si, že to může být odpověď.

V odpověď na další otázku, @GarethD státy:

Pokud si myslíte, že z pohledu více jak uložené poddotaz, než uložený dotaz ... a nezapomeňte, že jeho definice je rozšířena do hlavní dotaz ...

(Nesprávná Syntaxe Poblíž Klíčové slovo 'VOLBA' v CTE Prohlášení).

Pokud je to ten případ, zobrazení nemůže obsahovat nic, co nemůže být zahrnuto v poddotazu. To zahrnuje ORDER BY doložky a rady, např. OPTION.

Ještě jsem si jistá, ale myslím, že totéž platí i pro Stolní Cenil Funkce. Pokud ano, odpověď je ne, neexistuje žádný způsob, jak zahrnout OPTION doložka.

Všimněte si, že jiné systémy Dbms jsou vstřícnější v tom, co mohou být zahrnuty v poddotazy, takže nemyslím si, že mají stejné omezení.

2021-11-28 09:29:14

V jiných jazycích

Tato stránka je v jiných jazycích

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