Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment définir l'option maxrecursion pour un CTE dans une fonction de valeur de table

De ce fil de discussion sur les forums MSDN, j'apprends que

[la] OPTION la clause ne peut être utilisée qu'au niveau de l'instruction

Vous ne pouvez donc pas l'utiliser dans une expression de requête dans des définitions de vue ou des TVF en ligne, etc. La seule façon de l'utiliser dans votre cas est de créer le TVF sans l'OPTION clause et spécifiez-la dans la requête qui utilise TVF. Nous avons un bogue qui suit la demande d'autorisation d'utilisation de OPTION clause à l'intérieur de toute expression de requête (par exemple, if exists() ou CTE ou vue).

et plus loin

Vous ne pouvez pas modifier la valeur par défaut de cette option dans un udf. Vous devrez le faire dans la déclaration faisant référence à l'udf.

Donc dans votre exemple, vous devez spécifier le OPTION lorsque vous appelez votre fonction :

 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
 )

(plus tard)

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

Notez que vous ne pouvez pas contourner cela en ayant un deuxième TVF qui fait juste la ligne ci-dessus - vous obtenez la même erreur, si vous essayez. "[l'] OPTION clause ne peut être utilisée qu'au niveau de l'instruction", et c'est définitif (pour l'instant).