Not currently at my desk so the syntax might need correcting, but could you do something like this?
WITH CTE(N) AS (SELECT 1 FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))a(N)),
CTE2(N) AS (SELECT 1 FROM CTE x CROSS JOIN CTE y),
CTE3(N) AS (SELECT 1 FROM CTE2 x CROSS JOIN CTE2 y),
CTE4(N) AS (SELECT 1 FROM CTE3 x CROSS JOIN CTE3 y),
CTE5(N) AS (SELECT 1 FROM CTE4 x CROSS JOIN CTE4 y),
CTE6(N) AS (SELECT 0 UNION ALL
SELECT TOP 97199 ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
FROM CTE5),
TALLY(N) AS (SELECT DATEADD(month, N, 0)
FROM CTE6)
SELECT a.N AS recorddate, ISNULL(b.myValue,0) AS myValue
FROM TALLY a
OUTER APPLY (SELECT DATEADD(month, DATEDIFF(month, 0, [recorddate]), 0), SUM([myvalue])
FROM [#a] c
WHERE DATEADD(month, DATEDIFF(month, 0, [recorddate]), 0) = a.N
GROUP BY DATEADD(month, DATEDIFF(month, 0, [recorddate]), 0)
) b(recorddate,myValue)
CROSS APPLY (SELECT MIN(DATEADD(month, DATEDIFF(month, 0, [recorddate]), 0)),
MAX(DATEADD(month, DATEDIFF(month, 0, [recorddate]), 0))
FROM [#a]) d(minDate,maxDate)
WHERE a.N >= d.minDate AND a.N <= d.maxDate;