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

SQL Server:Viết lại CTE đệ quy để thay thế cho tùy chọn maxrecursion trong Chế độ xem

Bạn có thể sử dụng kiểm đếm:đó là một giải pháp dựa trên tập hợp, hoạt động tốt hơn đệ quy khi số lần lặp lại tăng lên - và nó được hỗ trợ trong các chế độ xem.

Đây là một cách tiếp cận:

select t.objectid, t.amount, dateadd(day, x.n, t.begindate) as dt
from (
    select row_number() over (order by (select null)) - 1
    from (values(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(n)
    cross join (values(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n)
    cross join (values(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n)
) x(n)
inner join tabledatarange t
    on dateadd(day, x.n, t.begindate) <= case 
        when enddate <= convert(date, getdate()) then enddate
        else convert(date, getdate())
    end

Việc kiểm đếm tạo ra tất cả các số từ 0 đến 999 (bạn có thể dễ dàng mở rộng nó bằng cách thêm cross join S). Chúng tôi sử dụng nó để "nhân" các hàng của bảng gốc và tạo phạm vi ngày.

Tôi đã cố gắng viết lại phần xử lý ngày kết thúc. Tôi hiểu rằng bạn không muốn có các ngày trong tương lai, vì vậy đó là điều kiện trong on mệnh đề không.

Đối với dữ liệu mẫu này:

ObjectId | Amount | beginDate  | endDate   
-------: | -----: | :--------- | :---------
       1 |    500 | 2020-12-28 | null      
       2 |     35 | 2019-09-26 | 2019-10-01
       3 |    200 | 2020-05-28 | 2020-06-02

Truy vấn trả về:

objectid | amount | dt        
-------: | -----: | :---------
       1 |    500 | 2020-12-28
       1 |    500 | 2020-12-29
       1 |    500 | 2020-12-30
       1 |    500 | 2020-12-31
       2 |     35 | 2019-09-26
       2 |     35 | 2019-09-27
       2 |     35 | 2019-09-28
       2 |     35 | 2019-09-29
       2 |     35 | 2019-09-30
       2 |     35 | 2019-10-01
       3 |    200 | 2020-05-28
       3 |    200 | 2020-05-29
       3 |    200 | 2020-05-30
       3 |    200 | 2020-05-31
       3 |    200 | 2020-06-01
       3 |    200 | 2020-06-02

Bản trình diễn trên DB Fiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách khắc phục “Lược đồ phân vùng‘… ’không có bất kỳ nhóm tệp nào được sử dụng tiếp theo” trong SQL Server

  2. Truy vấn SQL để chọn ngày giữa hai ngày

  3. Log4net ghi đối tượng tùy chỉnh vào cơ sở dữ liệu sql bằng cách sử dụng appender tùy chỉnh?

  4. Làm cách nào để thay đổi kiểu cơ sở của UDT trong Sql Server 2005?

  5. SQL tham gia:Tương lai của tiêu chuẩn ANSI SQL (ở đâu so với tham gia)?