I've used a function similar to MiddleDatestoTable in my apps, however I followed a different approach.
Create Function dbo.udf_NumbersTable (
@riStartingNumber Int, @riCount Int
)
Returns @tbl Table (SequenceNumber Int)
As
Begin
-- Logic used from http://www.sqlservercentral.com/articles/Datetime+Manipulation/61822/
;With
tblLevel0 As (Select 1 As C Union All Select 1), --2 rows
tblLevel1 As (Select 1 As C From tblLevel0 As A, tblLevel0 As B),--4 rows
tblLevel2 As (Select 1 As C From tblLevel1 As A, tblLevel1 As B),--16 rows
tblLevel3 As (Select 1 As C From tblLevel2 As A, tblLevel2 As B),--256 rows
tblLevel4 As (Select 1 As C From tblLevel3 As A, tblLevel3 As B),--65536 rows
tblLevel5 As (Select 1 As C From tblLevel4 As A, tblLevel4 As B),--4294967296 rows
tblSeq As (Select Row_Number() Over(Order By C) As N From tblLevel5)
Insert Into @tbl( SequenceNumber )
Select N + @riStartingNumber - 1 From tblSeq Where N Between 1 AND @riCount
Return
End
Go
Declare @dtStart DateTime, @dtEnd DateTime
Declare @iDays Int
-- Example values
Set @dtStart = '20091201'
Set @dtEnd = '20091225'
-- Usage
Set @iDays = DateDiff(d, @dtStart, @dtEnd) + 1
Select DateAdd(d, SequenceNumber, @dtStart) As DateValue
From dbo.udf_NumbersTable(0, @iDays)