sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man ställer in maxrekursionsalternativet för en CTE i en tabellvärderad-funktion

Från den här MSDN-forumtråden lär jag mig det

[den] OPTION sats kan endast användas på satsnivå

Så du kan inte använda det i ett frågeuttryck inuti vy-definitioner eller inline TVFs etc. Det enda sättet att använda det i ditt fall är att skapa TVF utan OPTION och ange den i frågan som använder TVF. Vi har en bugg som spårar begäran om att tillåta användning av OPTION sats i valfritt frågeuttryck (till exempel if exists() eller CTE eller visa).

och vidare

Du kan inte ändra standardvärdet för det alternativet i en udf. Du måste göra det i uttalandet som hänvisar till udf.

Så i ditt exempel måste du ange 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
 )

(senare)

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

Observera att du inte kan kringgå detta genom att ha en andra TVF som bara gör raden ovan - du får samma fel, om du försöker. "[den] OPTION sats kan endast användas på satsnivå", och det är slutgiltigt (för nu).



  1. Finns det en Entity Framework 7 Database-First POCO Generator?

  2. Utför regex (ersätt) i en SQL-fråga

  3. Beteende av NOT LIKE med NULL-värden

  4. Parallella utförandeplaner – grenar och trådar