I'm generating [Dim_Calendar] table for the data warehouse. I've developed a query below that takes 29 seconds to execute & inserts 27k rows. I would like to optimize it if it is possible. I do understand that while loop is not helping performance and I do not know how to replace it to achieve the same results.
I'm using SQL Server 2012 BI edition.
IF EXISTS(SELECT * FROM sys.indexes WHERE name='PK_Dim_Calendar_1' AND object_id = OBJECT_ID('Dim_Calendar'))
BEGIN
ALTER TABLE [dbo].[Dim_Calendar] DROP CONSTRAINT [PK_Dim_Calendar_1]
END
SET DATEFIRST 1--Sets Monday as 1st day of the week.
DECLARE @today DATETIME = ( SELECT GETDATE())
DECLARE @start DATETIME = DATEADD(dd, 1, (SELECT Max(date) FROM Dim_Calendar))
IF @start IS NULL
BEGIN
INSERT INTO [dbo].[Dim_Calendar]
VALUES (19000101, '1900-01-01', 'Monday', 1 ,'Unknown', 1, 'January', 1900, 1)
SET @start = '1940-01-01'
END
DECLARE @end DATETIME = (SELECT DATEFROMPARTS(YEAR(@today), 12, 31))
WHILE @start <= @end
BEGIN
INSERT INTO [dbo].[Dim_Calendar]
SELECT
YEAR(@start) * 10000 + MONTH(@start) * 100 + DAY(@start)
,@start
,DATENAME(dw, @start)
,DATEPART(wk, @start)
,'w/c ' + CONVERT(char(8), DATEADD(dd, 1 - DATEPART(dw, @start), @start), 3)
,DATEPART(mm, @start)
,DATENAME(MONTH, @start)
,YEAR(@start)
,DATEPART(QQ, @start)
SET @start = DATEADD(dd, 1, @start)
END
ALTER TABLE [dbo].[Dim_Calendar] ADD CONSTRAINT [PK_Dim_Calendar_1] PRIMARY KEY CLUSTERED
(
[FullDateID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO