Você pode fazer isso com um CTE . Algo assim:
DECLARE @startDate datetime = '2/1/2014'
DECLARE @endDate datetime = '2/6/2014'
;WITH DateRange(RunningDate) AS
(
SELECT @startDate AS RunningDate
UNION ALL
SELECT RunningDate + 1
FROM DateRange
WHERE RunningDate < @endDate
)
SELECT id, RunningDate date, value1, value2
FROM DateRange LEFT JOIN myTable ON myTable.date = DateRange.RunningDate
Editar... SE você optar por esta solução (observe o comentário de Aaron Bertrand na minha resposta), observe que você também precisará especificar o recursão máxima se pretende lidar com intervalos superiores a 3 meses. O padrão é definido como 100. Isso significa que, como a consulta está atualmente gravada, ela só fará no máximo 101 datas (100 níveis de recursão).
Você também pode especificar
OPTION (MAXRECURSION 0)
no final do último SELECT
para superar isso. 0 significa níveis infinitos de recursão. Mas, novamente, tome nota do post de Aaron.