Самый быстрый способ генерировать такие данные - Tally. Этого должно быть более чем достаточно, чтобы вы пошли по правильному пути:
DECLARE @StartDate date = '20000101',
@EndDate date = '20201231';
WITH N AS(
SELECT N
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
SELECT TOP (DATEDIFF(DAY, @StartDate, @EndDate)+1)
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 AS I
FROM N N1, N N2, N N3, N N4, N N5), --100,000 days, more than enough, but add more cross joins to N for more
Dates AS(
SELECT DATEADD(DAY, T.I, @StartDate) AS CalendarDate
FROM Tally T)
--INSERT INTO dbo.CalendarTable
SELECT CONVERT(varchar(8),D.CalendarDate,112) AS PK,
D.CalendarDate,
DATEPART(YEAR, D.CalendarDate) AS CalendarYear,
DATEPART(MONTH, D.CalendarDate) AS CalendarMonth,
DATEPART(DAY, D.CalendarDate) AS CalendarDay
FROM Dates D;