Możesz to zrobić za pomocą rekurencyjnego CTE . Coś takiego:
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
Edytuj... JEŚLI zdecydujesz się na to rozwiązanie (zwróć uwagę na komentarz Aarona Bertranda pod moją odpowiedzią), pamiętaj, że będziesz musiał również określić maksymalna rekurencja jeśli zamierzasz radzić sobie z zakresami dłuższymi niż 3 miesiące. Wartość domyślna jest ustawiona na 100. Oznacza to, że ponieważ zapytanie jest obecnie napisane, wykona tylko maksymalnie 101 dat (100 poziomów rekursji).
Możesz dodatkowo określić OPTION (MAXRECURSION 0)
na końcu ostatniego SELECT
by to przezwyciężyć. 0 oznacza nieskończone poziomy rekurencji. Ale znowu, zwróć uwagę na post Aarona.