Dies funktioniert auch dann, wenn das @StartDate nicht der erste des Monats ist. Ich gehe davon aus, dass Sie, wenn es nicht der Monatsanfang ist, mit dem Ersten des nächsten Monats beginnen möchten. Entfernen Sie andernfalls das +1.:
;WITH cte AS (
SELECT CASE WHEN DATEPART(Day,@StartDate) = 1 THEN @StartDate
ELSE DATEADD(Month,DATEDIFF(Month,0,@StartDate)+1,0) END AS myDate
UNION ALL
SELECT DATEADD(Month,1,myDate)
FROM cte
WHERE DATEADD(Month,1,myDate) <= @EndDate
)
SELECT myDate
FROM cte
OPTION (MAXRECURSION 0)