Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server :réécrire le CTE récursif pour remplacer l'option maxrecursion dans une vue

Vous pouvez utiliser un décompte :il s'agit d'une solution basée sur un ensemble, qui fonctionne mieux que la récursivité lorsque le nombre d'itérations augmente - et elle est prise en charge dans les vues.

Voici une approche :

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

Le décompte génère tous les nombres entre 0 et 999 (vous pouvez facilement l'étendre en ajoutant cross join s). Nous l'utilisons pour "multiplier" les lignes du tableau d'origine et générer la plage de dates.

J'ai tenté de réécrire la partie qui gère la date de fin. Je comprends que vous ne voulez pas de dates futures, c'est donc ce que la condition dans le on clause le fait.

Pour cet exemple de données :

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

La requête renvoie :

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

Démo sur DB Fiddle