sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo configurar la opción maxrecursion para un CTE dentro de una función con valores de tabla

De este hilo de foros de MSDN aprendo que

[la] OPTION la cláusula solo se puede usar en el nivel de declaración

Por lo tanto, no puede usarlo dentro de una expresión de consulta dentro de definiciones de vista o TVF en línea, etc. La única forma de usarlo en su caso es crear el TVF sin la OPTION y especifíquelo en la consulta que utiliza el TVF. Tenemos un error que rastrea la solicitud para permitir el uso de OPTION cláusula dentro de cualquier expresión de consulta (por ejemplo, if exists() o CTE o ver).

y más

No puede cambiar el valor predeterminado de esa opción dentro de un udf. Tendrás que hacerlo en la declaración que hace referencia a la udf.

Entonces, en su ejemplo, debe especificar la OPTION cuando llamas tu función:

 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
 )

(más tarde)

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

Tenga en cuenta que no puede evitar esto teniendo un segundo TVF que solo haga la línea anterior; obtendrá el mismo error, si lo intenta. "[la] OPTION La cláusula solo se puede usar en el nivel de declaración", y eso es definitivo (por ahora).