Bạn có thể thực hiện việc này với CTE . Một cái gì đó như thế này:
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
Chỉnh sửa ... NẾU bạn đồng ý với giải pháp này (lưu ý nhận xét của Aaron Bertrand dưới câu trả lời của tôi), hãy lưu ý rằng bạn cũng sẽ phải chỉ định đệ quy tối đa nếu bạn có ý định giao dịch với phạm vi lớn hơn 3 tháng. Giá trị mặc định được đặt thành 100. Điều này có nghĩa là khi truy vấn hiện đang được viết, nó sẽ chỉ thực hiện tối đa 101 ngày (100 mức đệ quy).
Ngoài ra, bạn có thể chỉ định OPTION (MAXRECURSION 0)
ở cuối SELECT
cuối cùng để khắc phục điều này. 0 có nghĩa là mức đệ quy vô hạn. Nhưng một lần nữa, hãy lưu ý đến bài đăng của Aaron.