SQL Server 2008/R2 – out of Mainstream Support – vote here!

Microsoft-SQL-Server-2008-R2Der SQL Server 2008 und R2 laufen im Juli aus dem Mainstream Support raus, falls Microsoft hier kein Service Pack mehr ausliefert. Daher hoffe ich, dass hier genügend Stimmen zusammen kommen, damit hier je ein SP veröffentlicht wird und es so abschliessend nicht zu einer Sammlung von CU oder Hotfixen kommt.

Hier zur Wahl auf MS Connect: https://connect.microsoft.com/SQLServer/feedback/details/814658/release-final-service-packs-for-sql-server-2008-and-2008-r2

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

SSIS: Doppelte Zeilen in einem Daten-Ziel ignorieren, neue aber einfügen

filestreamIn manchen Projekten ist es unumgänglich Daten in ein Data Warehouse in eine Fakten Tabelle zu laden, wo bereits Werte aus der Quelle im Ziel enthalten sind. Somit dürfen nur die neuen Werte eingefügt werden, die aber bereits vorhandenen sind. Da das Konzept Slowly Changing Dimensions hier nicht anwendbar ist, kann man hier das OLE DB Ziel für diese Aktion verwenden. Beim Laden darf aber nicht das schnelle Laden der Tabelle verwendet werden, da so eine große Transaktion fehlschlagen würde, sondern es muss das “einfache Laden” verwendet werden:

Anschliessend können in der Fehlerausgabe die Fehler ignoriert werden:

Das ganze hat natürlich zum Nachteil, dass alle Transaktionen so immer einwandfrei funktionieren, obwohl vielleicht andere Fehler sich in den Daten befinden. Dafür sollte man ggf. mit Zählwerten validiieren um sicherzustellen, dass neue Daten geladen wurden. Insbesondere in einer Sales Tabelle sollten normalerweise immer neue Zeilen hinzukommen, ansonsten ist entweder der ETL Prozess fehlerhaft oder das Business und das Projekt sollte insgesamt umgehend fakturiert werden ;-)

Guten Rutsch ins neue Jahr!!