Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

SQL Server:Tulis ulang CTE rekursif untuk menggantikan opsi maxrecursion dalam Tampilan

Anda dapat menggunakan penghitungan:itu adalah solusi berbasis himpunan, yang berkinerja lebih baik daripada rekursi ketika jumlah iterasi meningkat - dan didukung dalam tampilan.

Berikut ini pendekatannya:

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

Penghitungan menghasilkan semua angka antara 0 dan 999 (Anda dapat dengan mudah memperluasnya dengan menambahkan cross join s). Kami menggunakannya untuk "menggandakan" baris tabel asli dan menghasilkan rentang tanggal.

Saya mencoba menulis ulang bagian yang menangani tanggal akhir. Saya mengerti bahwa Anda tidak menginginkan tanggal yang akan datang, jadi begitulah kondisinya di on klausa tidak.

Untuk contoh data ini:

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

Kueri mengembalikan:

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

Demo di 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. Apa perbedaan antara kunci unik dengan batasan 'bukan nol' dan kunci utama?

  2. SQL Server:Cara terbaik untuk menggabungkan beberapa kolom?

  3. Buat Pemicu DML di SQL Server

  4. Kueri Hibernasi berjalan lambat di sistem, tetapi cepat ketika dijalankan secara langsung

  5. Hitung Hari Hadir dan absen dari tabel