Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách đặt tùy chọn maxrecursion cho một CTE bên trong một Table-Valued-Function

Từ chuỗi diễn đàn MSDN này, tôi biết rằng

[the] OPTION mệnh đề chỉ có thể được sử dụng ở cấp câu lệnh

Vì vậy, bạn không thể sử dụng nó trong biểu thức truy vấn bên trong định nghĩa chế độ xem hoặc TVF nội tuyến, v.v. Cách duy nhất để sử dụng nó trong trường hợp của bạn là tạo TVF mà không có OPTION và chỉ định nó trong truy vấn sử dụng TVF. Chúng tôi có một lỗi theo dõi yêu cầu cho phép sử dụng OPTION mệnh đề bên trong bất kỳ biểu thức truy vấn nào (ví dụ:if exists() hoặc CTE hoặc chế độ xem).

và xa hơn nữa

Bạn không thể thay đổi giá trị mặc định của tùy chọn đó trong udf. Bạn sẽ phải làm điều đó trong tuyên bố tham chiếu đến udf.

Vì vậy, trong ví dụ của bạn, bạn phải chỉ định OPTION khi bạn gọi chức năng của bạn:

 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
 )

(sau)

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

Lưu ý rằng bạn không thể giải quyết vấn đề này bằng cách có TVF thứ hai giống như dòng trên - bạn sẽ gặp lỗi tương tự, nếu bạn cố gắng. "[the] OPTION mệnh đề chỉ có thể được sử dụng ở cấp câu lệnh "và đó là mệnh đề cuối cùng (hiện tại).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để triển khai LIMIT với SQL Server?

  2. 3 cách lấy tên ngày từ ngày trong SQL Server (T-SQL)

  3. SQL Server 2000 - Máy chủ được liên kết

  4. SQL Server Resumable Index:Nó có tốt cho bạn không?

  5. CUBE OLAP đa chiều là gì và cho ví dụ về hình khối có nhiều hơn 3 kích thước