Одним из вариантов является рекурсивный запрос:
with cte as (
select good_id, store_id, promo_name, date_id_begin, date_id_end
from mytable
union all
select good_id, store_id, promo_name, dateadd(day, 1, date_id_begin), date_id_end
from cte
where date_id_begin < date_id_end
)
select good_id, store_id, promo_name, date_id_begin from cte
Если у вас есть диапазоны, которые охватывают более 100 дней, вам нужно добавить option(max_recursion 0)
в конце запроса.