Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como definir a opção maxrecursion para um CTE dentro de uma função de valor de tabela


A partir deste tópico de fóruns do MSDN, aprendi que

[a] OPTION cláusula pode ser usada apenas no nível de instrução

Portanto, você não pode usá-lo em uma expressão de consulta dentro de definições de exibição ou TVFs inline etc. A única maneira de usá-lo no seu caso é criar o TVF sem a OPTION cláusula e especifique-a na consulta que usa o TVF. Temos um bug que rastreia a solicitação para permitir o uso de OPTION cláusula dentro de qualquer expressão de consulta (por exemplo, if exists() ou CTE ou vista).

e mais

Você não pode alterar o valor padrão dessa opção dentro de um udf. Você terá que fazer isso na declaração referenciando o udf.

Portanto, em seu exemplo, você deve especificar a OPTION quando você liga sua função:
 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
 )

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

Observe que você não pode contornar isso tendo um segundo TVF que apenas faça a linha acima - você obtém o mesmo erro, se tentar. "[a] OPTION cláusula pode ser usada apenas no nível de instrução", e isso é final (por enquanto).