sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server:Skriv om rekursiv CTE för att ersätta alternativet maxrecursion i en vy

Du kan använda en sammanställning:det är en uppsättningsbaserad lösning, som presterar bättre än rekursion när antalet iterationer ökar - och det stöds i vyer.

Här är ett tillvägagångssätt:

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

Samlingen genererar alla tal mellan 0 och 999 (du kan enkelt utöka den genom att lägga till cross join s). Vi använder den för att "multiplicera" raderna i den ursprungliga tabellen och generera datumintervallet.

Jag försökte skriva om den del som hanterar slutdatumet. Jag förstår att du inte vill ha framtida datum, så det är vad villkoret i on klausul gör det.

För dessa exempeldata:

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

Frågan returnerar:

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 på DB Fiddle



  1. Hämta data inom ett datumintervall i Oracle

  2. Utdataparametrar för lagrad procedur i SQL Server Profiler

  3. Vad är andra nivån SQL Injection

  4. Vad betyder INT(5) i mysql?