Script zum Erstellen einer Datums-Dimensions Tabelle

PowerPivot_LogoDa ich ständig immer wieder Systeme habe, wo ich keine ausreichende Datums-Dimensions Tabelle vorfinde, bspw. für ein Data Warehouse, habe ich nachfolgendes TSQL Script entwickelt welches mir alle nötigen Felder zurückliefert. Das Script erstellt hier erstmal eine Table Variable und füllt diese, dies sollte man dann durch ein CREATE TABLE austauschen und die Tabelle so erzeugen. Das Script ist teils etwas umfänglich und redundant geschrieben, für aber einen nicht so TSQL Profi ist es so übersichtlich. Gerne dazu auch Feedback!

Frohes Neues Jahr!

Die Tabelle

Das Script

SET NOCOUNT ON;

-- Start Datum ab wann gezählt werden soll
DECLARE @Start DATE = '20000101';
-- Ende Datum bis wann gezählt werden soll
DECLARE @Ende DATE = '20401231';

-- Table Variable; sollte umgestellt werden auf ein CREATE TABLE wenn die Tabelle physisch angelegt werden soll
DECLARE @DateDimension TABLE (
    DateKey INT NOT NULL PRIMARY KEY,
    Tagesdatum DATE NOT NULL,
    TagDerWocheNummer TINYINT NOT NULL,
    Wochentagsname NVARCHAR(10) NOT NULL,
    TagDesMonatsNummer TINYINT NOT NULL,
    MonatsNummer TINYINT NOT NULL,
    Quartal TINYINT NOT NULL,
    QuartalName NVARCHAR(20) NOT NULL,
    KalenderJahr SMALLINT NOT NULL,
    Semester TINYINT NOT NULL,
    QuartalMitJahr NVARCHAR(30) NOT NULL,
    KalenderWoche TINYINT NOT NULL,
    KalenderWocheName NVARCHAR(20) NOT NULL,
    MonatsnummerMitJahr NVARCHAR(20) NOT NULL,
    KalenderWocheMitJahr NVARCHAR(20) NOT NULL,
    Monatsname NVARCHAR(30) NOT NULL,
    SemesterMitJahr NVARCHAR(20) NOT NULL
    );

DECLARE @DateKey INT;
DECLARE @Tagesdatum DATE;
DECLARE @TagDerWocheNummer TINYINT;
DECLARE @Wochentagsname NVARCHAR(10);
DECLARE @TagDesMonatsNummer TINYINT;
DECLARE @MonatsNummer TINYINT;
DECLARE @Quartal TINYINT;
DECLARE @QuartalName NVARCHAR(20);
DECLARE @KalenderJahr SMALLINT;
DECLARE @Semester TINYINT;
DECLARE @QuartalMitJahr NVARCHAR(30);
DECLARE @KalenderWoche TINYINT;
DECLARE @KalenderWocheName NVARCHAR(20);
DECLARE @MonatsnummerMitJahr NVARCHAR(20);
DECLARE @KalenderWocheMitJahr NVARCHAR(20);
DECLARE @Monatsname NVARCHAR(30);
DECLARE @SemesterMitJahr NVARCHAR(20);

DECLARE @inkrement INT = 1

WHILE @Start < @Ende
BEGIN
    
    SET @DateKey = CONVERT(INT, CONVERT(VARCHAR(8), @Start, 112));
    SET @Tagesdatum = @Start;
    SET @TagDerWocheNummer = DATEPART(dw, @Tagesdatum);
    SET @Wochentagsname = DATENAME(dw, @Tagesdatum);
    SET @TagDesMonatsNummer = DATEPART(dd, @Tagesdatum);
    SET @MonatsNummer = MONTH(@Tagesdatum);
    SET @Quartal = DATEPART(qq, @Tagesdatum);
    SET @QuartalName = 'Q ' + CONVERT(VARCHAR, @Quartal);
    SET @KalenderJahr = YEAR(@Tagesdatum);
    SET @Semester = CASE WHEN @MonatsNummer < 6 THEN 1 ELSE 2 END;
    SET @QuartalMitJahr = @QuartalName + ' ' + CONVERT(VARCHAR, @KalenderJahr);
    SET @KalenderWoche = DATEPART(wk, @Tagesdatum);
    SET @KalenderWocheName = 'KW ' + CONVERT(VARCHAR, @KalenderWoche);
    SET @MonatsnummerMitJahr = CONVERT(VARCHAR, @Monatsnummer) + ' ' + CONVERT(VARCHAR, @KalenderJahr);
    SET @KalenderWocheMitJahr = CONVERT(VARCHAR, @KalenderWoche) + ' ' + CONVERT(VARCHAR, @KalenderJahr);
    SET @Monatsname = DATENAME(m, @Tagesdatum);
    SET @SemesterMitJahr = CONVERT(VARCHAR, @Semester) + ' ' + CONVERT(VARCHAR, @KalenderJahr);
    
    -- Auch hier muss eine Anpassung dann auf die physische Tabelle erfolgen
    INSERT INTO @DateDimension
        ( DateKey, Tagesdatum, TagDerWocheNummer, Wochentagsname, TagDesMonatsNummer, MonatsNummer,
          Quartal, QuartalName, KalenderJahr, Semester, QuartalMitJahr, KalenderWoche, KalenderWocheName,
          MonatsnummerMitJahr, KalenderWocheMitJahr, Monatsname, SemesterMitJahr)
        VALUES 
        (@DateKey, @Tagesdatum, @TagDerWocheNummer, @Wochentagsname, @TagDesMonatsNummer, @MonatsNummer,
         @Quartal, @QuartalName, @KalenderJahr, @Semester, @QuartalMitJahr, @KalenderWoche, @KalenderWocheName,
         @MonatsnummerMitJahr, @KalenderWocheMitJahr, @Monatsname, @SemesterMitJahr);
         
    SET @Start = DATEADD(day, @inkrement, @Start);
END

SELECT * FROM @DateDimension