Puoi farlo con un CTE
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
Modifica... SE scegli questa soluzione (prendi nota del commento di Aaron Bertrand sotto la mia risposta), tieni presente che dovrai anche specificare max ricorsione se intendi affrontare range maggiori di 3 mesi. Il valore predefinito è 100. Ciò significa che, poiché la query è attualmente scritta, eseguirà solo un massimo di 101 date (100 livelli di ricorsione).
Puoi inoltre specificare OPTION (MAXRECURSION 0)
alla fine dell'ultimo SELECT
per superare questo. 0 significa infiniti livelli di ricorsione. Ma ancora una volta, prendi nota del post di Aaron.