Можете да използвате преброяване:това е базирано на набор решение, което се представя по-добре от рекурсия, когато броят на итерациите се увеличи - и се поддържа в изгледи.
Ето един подход:
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
Преброяването генерира всички числа между 0 и 999 (можете лесно да го разширите, като добавите cross join с). Използваме го, за да „умножим“ редовете на оригиналната таблица и да генерираме периода от време.
Опитах се да пренапиша частта, която обработва крайната дата. Разбирам, че не искате бъдещи дати, така че това е условието в on клауза прави.
За тези примерни данни:
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
Заявката връща:
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