Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come impostare l'opzione maxrecursion per un CTE all'interno di una funzione con valori di tabella

Da questo thread del forum MSDN apprendo che

[il] OPTION la clausola può essere utilizzata solo a livello di istruzione

Quindi non puoi usarlo all'interno di un'espressione di query all'interno di definizioni di visualizzazione o TVF inline ecc. L'unico modo per usarlo nel tuo caso è creare il TVF senza OPTION clausola e specificarlo nella query che utilizza la TVF. Abbiamo un bug che tiene traccia della richiesta per consentire l'uso di OPTION clausola all'interno di qualsiasi espressione di query (ad esempio, if exists() o CTE o visualizza).

e oltre

Non è possibile modificare il valore predefinito di tale opzione all'interno di un udf. Dovrai farlo nella dichiarazione che fa riferimento all'udf.

Quindi nel tuo esempio, devi specificare OPTION quando chiama la tua funzione:

 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
 )

(più tardi)

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

Nota che non puoi aggirare questo problema avendo un secondo TVF che esegue solo la riga sopra:ottieni lo stesso errore, se provi. "[il] OPTION la clausola può essere utilizzata solo a livello di istruzione", e questo è definitivo (per ora).