sql >> Database >  >> RDS >> Sqlserver

Hoe de maxrecursion-optie voor een CTE in een Table-Valued-Function in te stellen?

Uit deze MSDN-forumthread leer ik dat

[de] OPTION clausule kan alleen worden gebruikt op het niveau van de instructie

U kunt het dus niet gebruiken binnen een query-uitdrukking binnen weergavedefinities of inline TVF's enz. De enige manier om het in uw geval te gebruiken, is door de TVF te maken zonder de OPTION clausule en specificeer deze in de query die gebruikmaakt van de TVF. We hebben een bug die het verzoek volgt om het gebruik van OPTION toe te staan clausule binnen een query-expressie (bijvoorbeeld if exists() of CTE of bekijk).

en verder

U kunt de standaardwaarde van die optie niet wijzigen in een udf. U moet dit doen in de verklaring die verwijst naar de udf.

Dus in uw voorbeeld moet u de OPTION . specificeren wanneer u belt jouw functie:

 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
 )

(later)

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

Merk op dat je dit niet kunt omzeilen door een tweede TVF te hebben die alleen de bovenstaande regel doet - je krijgt dezelfde fout als je het probeert. "[de] OPTION clausule kan alleen worden gebruikt op het niveau van de instructie", en dat is definitief (voorlopig).



  1. Hoe de NCHAR()-functie werkt in SQL Server (T-SQL)

  2. Tel het aantal records dat door groep is geretourneerd door

  3. Deadlocks diagnosticeren in SQL Server 2005

  4. NULLIF() Functie in Oracle