Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server:Schreiben Sie den rekursiven CTE neu, um die Option maxrecursion in einer Ansicht zu ersetzen

Sie könnten ein Tally verwenden:Das ist eine mengenbasierte Lösung, die besser abschneidet als die Rekursion, wenn die Anzahl der Iterationen zunimmt – und die in Ansichten unterstützt wird.

Hier ist ein Ansatz:

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

Das Tally generiert alle Zahlen zwischen 0 und 999 (Sie können es einfach erweitern, indem Sie cross join hinzufügen s). Wir verwenden es, um die Zeilen der ursprünglichen Tabelle zu "multiplizieren" und den Datumsbereich zu generieren.

Ich habe versucht, den Teil umzuschreiben, der das Enddatum behandelt. Ich verstehe, dass Sie keine Daten in der Zukunft möchten, also ist die Bedingung in on Klausel tut.

Für diese Beispieldaten:

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

Die Abfrage gibt zurück:

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 auf DB Fiddle