Как насчет этого? Вы можете расширить корпус, чтобы учесть другие частоты
DECLARE @Table TABLE(
TaskName VARCHAR(10),
StartDate DATETIME,
Frequency VARCHAR(10) --let say D,W,M daily, weekly, monthly
)
INSERT INTO @Table (TaskName,StartDate,Frequency) SELECT 'TADA', '15 Jan 2009', 'M'
DECLARE @StartDate DATETIME,
@EndDate DATETIME
SELECT @StartDate = '27 Nov 2009',
@EndDate = '27 Nov 2010'
;WITH cte AS(
SELECT TaskName,
StartDate,
Frequency
FROM @Table
UNION ALL
SELECT TaskName,
CASE
WHEN Frequency = 'M' THEN DATEADD(mm,1,StartDate)
END,
Frequency
FROM cte
WHERE StartDate <= @EndDate
)
SELECT *
FROM cte
WHERE StartDate BETWEEN @StartDate AND @EndDate
OPTION (MAXRECURSION 0)