Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So setzen Sie die maxrecursion-Option für einen CTE innerhalb einer Tabellenwertfunktion

Aus diesem Thread im MSDN-Forum erfahre ich das

[die] OPTION -Klausel kann nur auf Anweisungsebene verwendet werden

Sie können es also nicht innerhalb eines Abfrageausdrucks innerhalb von Ansichtsdefinitionen oder Inline-TVFs usw. verwenden. Die einzige Möglichkeit, es in Ihrem Fall zu verwenden, besteht darin, das TVF ohne die OPTION zu erstellen -Klausel und geben Sie sie in der Abfrage an, die die TVF verwendet. Wir haben einen Fehler, der die Anfrage zum Zulassen der Verwendung von OPTION verfolgt -Klausel in einem beliebigen Abfrageausdruck (z. B. if exists()). oder CTE oder Ansicht).

und weiter

Sie können den Standardwert dieser Option innerhalb einer UDF nicht ändern. Sie müssen dies in der Anweisung tun, die auf die UDF verweist.

In Ihrem Beispiel müssen Sie also die OPTION angeben wenn Sie anrufen Ihre Funktion:

 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
 )

(später)

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

Beachten Sie, dass Sie dies nicht umgehen können, indem Sie ein zweites TVF haben, das nur die obige Zeile ausführt - Sie erhalten den gleichen Fehler, wenn Sie es versuchen. "[die] OPTION -Klausel kann nur auf Anweisungsebene verwendet werden", und das ist (vorerst) endgültig.