sql >> Databáze >  >> RDS >> Sqlserver

Jak nastavit možnost maxrecursion pro CTE uvnitř funkce Table-Valued-Function

Z tohoto vlákna fóra MSDN jsem se dozvěděl, že

[the] OPTION klauzuli lze použít pouze na úrovni příkazu

Nemůžete jej tedy použít ve výrazu dotazu v definicích zobrazení nebo v inline TVF atd. Jediný způsob, jak to ve vašem případě použít, je vytvořit TVF bez OPTION klauzuli a specifikujte ji v dotazu, který používá TVF. Máme chybu, která sleduje požadavek na povolení použití OPTION klauzule uvnitř libovolného výrazu dotazu (například if exists() nebo CTE nebo zobrazení).

a dále

Výchozí hodnotu této možnosti uvnitř souboru udf nemůžete změnit. Budete to muset udělat v prohlášení odkazujícím na udf.

Takže ve vašem příkladu musíte zadat OPTION když zavoláte vaše funkce:

 CREATE FUNCTION [liste_jour]  
 (@debut date,@fin date)
 RETURNS TABLE
 AS     
 RETURN      
 (  
  WITH CTE as(       
  SELECT @debut as jour       
  UNION  ALL       
  SELECT DATEADD(day, 1, jour)       
  FROM   CTE      
  WHERE  DATEADD(day, 1, jour) <= @fin)
  SELECT jour FROM CTE -- no OPTION here
 )

(později)

SELECT * FROM [liste_jour] ( @from , @to ) OPTION ( MAXRECURSION 365 )

Všimněte si, že to nemůžete obejít tím, že budete mít druhý TVF, který dělá pouze výše uvedený řádek - pokud to zkusíte, dostanete stejnou chybu. "[the] OPTION klauzuli lze použít pouze na úrovni příkazů“, a to je (prozatím) konečné.



  1. chyba při vkládání do tabulky, která má místo spouštěče z rámce dat entity

  2. Zahrnout chybějící měsíce do dotazu Seskupit podle

  3. Jak změnit datový typ sloupce v databázi SQL bez ztráty dat

  4. Volání funkce pl/sql v Javě?