Keine Joins oder rekursiven CTEs erforderlich. Die Standardlösung für Lücken und Inseln besteht darin, zu gruppieren nach (Wert minus Zeilennummer), da dies innerhalb einer aufeinanderfolgenden Sequenz unveränderlich ist. Die Start- und Enddaten sind nur die MIN() und MAX() der Gruppe.
WITH t AS (
SELECT InfoDate d,ROW_NUMBER() OVER(ORDER BY InfoDate) i
FROM @d
GROUP BY InfoDate
)
SELECT MIN(d),MAX(d)
FROM t
GROUP BY DATEDIFF(day,i,d)