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

Sådan indstilles maxrecursion-indstillingen for en CTE inde i en Tabel-Valued-Function

Fra denne MSDN-forum-tråd lærer jeg det

[den] OPTION klausul kan kun bruges på sætningsniveauet

Så du kan ikke bruge det i et forespørgselsudtryk inde i visningsdefinitioner eller inline TVF'er osv. Den eneste måde at bruge det i dit tilfælde er at oprette TVF'et uden OPTION klausul og angiv den i forespørgslen, der bruger TVF. Vi har en fejl, der sporer anmodning om at tillade brug af OPTION klausul inde i et hvilket som helst forespørgselsudtryk (f.eks. if exists() eller CTE eller view).

og videre

Du kan ikke ændre standardværdien for denne indstilling inde i en udf. Du bliver nødt til at gøre det i erklæringen, der henviser til udf.

Så i dit eksempel skal du angive OPTION når du ringer din 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
 )

(senere)

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

Bemærk, at du ikke kan omgå dette ved at have en anden TVF, der bare udfører ovenstående linje - du får den samme fejl, hvis du prøver. "[den] OPTION klausul kan kun bruges på sætningsniveau", og det er endeligt (indtil videre).



  1. CEILING() Eksempler i SQL Server

  2. Få resultater mellem to datoer i PostgreSQL

  3. Forstå DROP TABLE Statement i SQL Server

  4. Hvordan COS() virker i MariaDB