Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak ustawić opcję maxrecursion dla CTE wewnątrz funkcji Table-Valued-Function?

Z tego wątku na forach MSDN dowiaduję się, że

[the] OPTION klauzula może być użyta tylko na poziomie instrukcji

Dlatego nie można go używać w wyrażeniu zapytania wewnątrz definicji widoku lub wbudowanych funkcji TVF itp. Jedynym sposobem użycia go w twoim przypadku jest utworzenie funkcji TVF bez OPTION klauzuli i określ ją w zapytaniu, które używa funkcji TVF. Mamy błąd, który śledzi prośbę o zezwolenie na użycie OPTION klauzula wewnątrz dowolnego wyrażenia zapytania (na przykład if exists() lub CTE lub widok).

i dalej

Nie możesz zmienić domyślnej wartości tej opcji w UDF. Musisz to zrobić w oświadczeniu odnoszącym się do udf.

Więc w swoim przykładzie musisz określić OPTION kiedy zadzwonisz Twoja funkcja:

 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
 )

(później)

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

Zauważ, że nie możesz tego obejść, mając drugi TVF, który wykonuje powyższą linię - otrzymasz ten sam błąd, jeśli spróbujesz. "[the] OPTION klauzula może być użyta tylko na poziomie instrukcji”, i to już koniec (na razie).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zastąpić NULL inną wartością w SQL Server – ISNULL()

  2. Jak zainstalować SSMS

  3. Czy jest jakaś różnica między DECIMAL i NUMERIC w SQL Server?

  4. SQL Server 2016:Wstaw dane

  5. Lokalne i globalne tabele tymczasowe w SQL Server