Нет необходимости использовать курсор. Основанный на множестве подход будет состоять в том, чтобы использовать таблицу Календаря. Итак, сначала мы создаем нашу календарную таблицу, которая должна быть сделана только один раз и должна быть несколько постоянной:
Create Table dbo.Calendar ( Date datetime not null Primary Key Clustered )
GO
; With Numbers As
(
Select ROW_NUMBER() OVER( ORDER BY S1.object_id ) As [Counter]
From sys.columns As s1
Cross Join sys.columns As s2
)
Insert dbo.Calendar([Date])
Select DateAdd(d, [Counter], '19000101')
From Numbers
Where [Counter] <= 100000
GO
Я заполнил его датами 100K, которые входят в 2300. Очевидно, вы всегда можете расширить его. Далее мы генерируем наши тестовые данные:
Create Table dbo.Data(Id int not null, [Name] nvarchar(20) not null)
GO
Insert dbo.Data(Id, [Name]) Values(42,'South Yorkshire')
Insert dbo.Data(Id, [Name]) Values(43, 'Lancashire')
Insert dbo.Data(Id, [Name]) Values(44, 'Norfolk')
GO
Теперь проблема становится тривиальной:
Declare @Start datetime
Declare @End datetime
Set @Start = '2010-01-01'
Set @End = '2010-01-03'
Select Dates.[Date], Id, [Name]
From dbo.Data
Cross Join (
Select [Date]
From dbo.Calendar
Where [Date] >= @Start
And [Date] <= @End
) As Dates