sql >> Databáze >  >> RDS >> Sqlserver

SQL Server:Přepište rekurzivní CTE, abyste nahradili možnost maxrecursion v pohledu

Můžete použít záznam:to je řešení založené na množinách, které funguje lépe než rekurze, když se zvýší počet iterací – a je podporováno v zobrazeních.

Zde je přístup:

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

Záznam vygeneruje všechna čísla mezi 0 a 999 (můžete jej snadno rozšířit přidáním cross join s). Používáme jej k „vynásobení“ řádků původní tabulky a vygenerování časového období.

Pokusil jsem se přepsat část, která zpracovává koncové datum. Chápu, že nechcete budoucí data, takže to je podmínka v on klauzule ano.

Pro tato ukázková data:

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

Dotaz vrátí:

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

Ukázka na DB Fiddle



  1. třída připojení k databázi PHP

  2. MySQL C++ Connector nevyřešený externí symbol _get_driver_instance

  3. Jak získat aktuální čas v SQLite

  4. Jak naplánovat mysql uloženou proceduru ve Windows?