Используйте рекурсивный CTE. Предполагая, что столбцы на самом деле являются датами:
with cte as (
select ID, StartDateID, EndDateID
from t
union all
select id, dateadd(day, 1, startdateid), enddateid
from cte
where startdateid < enddateid
)
select *
from cte;
Если столбцы не являются датами, я бы посоветовал их преобразовать:
with cte as (
select ID, convert(date, StartDateID) as startdate, convert(date, EndDateID) as enddate
from t
union all
select id, dateadd(day, 1, startdate), enddate
from cte
where startdate < enddate
)
select *
from cte;
Здесь - это db < > fiddle.
Если ваши промежутки могут превышать 100 дней, вам нужно добавить OPTION (MAXRECURSION 0)
в запрос.