none
SSIS: Wenn ABC gelesen wird, ABC hinzufügen bis DEF gelesen wird - ab hier DEF eintragen bis GHI gelesen wird ... RRS feed

  • Frage

  • Hallo,

    von einem Flatfile lese ich folgende Information:

    Benutzer abc
    Word
    Excel
    PowerPoint
    ***
    Benutzer def
    Excel
    ***
    Benutzer ghi
    Word
    Project

    Nun möchte ich in meiner Datenbank folgende Informationen haben:

    abc Benutzer abc
    abc Word
    abc Excel
    abc PowerPoint
    abc ***
    def Benutzer def (Anmerkung: Kann auch "abc Benutzer def" sein)
    def Excel
    def ***
    ghi Benutzer ghi (Anmerkung: Kann auch "def Benutzer ghi" sein)
    ghi Word
    ghi Project

    Die Anzahl der in meinem Beispiel genannten Benutzer ist sehr übersichtlich und ändert sich nur ein bis zwei Mal pro Jahr. Deswegen auch die Anmerkungen ;)

    Mit einem Derived Column Task kann ich meine Lösung nicht abbilden. Ein Conditional Split ist hier auch fehl am Platz.

    Kann mir jemand ein Schlagwort nennen, mit welchem ich meine Lösung abbilden kann?

    Dankeschön

    Montag, 23. Dezember 2013 15:28

Antworten

  • Hallo Stephan,

    eine eher ungewöhnliche Anforderung aber durchaus einfach zu lösen und zwar mit eine Script-Komponente vom Typ "Transformation".

    Also, einmal ein SSIS Package mit einem Datenfluss-Task anlegen, dort dann eine Flatfile Quelle einfügen und eine "Script-Komponent", auf Nachfrage dann Type = Transformation auswählen, zum Schluß noch die gewünschte Quelle.

    In den Eigenschaften der "Script Componente" musst Du die Eingabespalten festlegen (bei mir InputCol benannt) und eine neue Ausgabespalte anlegen, bei mir habe ich sie "LastUserNameCol" genannt. Dann noch das Script selbst bearbeiten, da muss Du nur den nachfolgenden Code in der bereits angelegten Methode "Input0_ProcessInputRow" einfügen sowie die eine Variablendeklaration von lastUserName.

    [Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
    public class ScriptMain : UserComponent
    {
        
        private static string lastUserName;
    
        public override void Input0_ProcessInputRow(Input0Buffer Row)
        {
            if (Row.InputCol.StartsWith("Benutzer"))
            {
                lastUserName = Row.InputCol.Substring(8).Trim();
            }
    
            Row.LastUserNameCol = lastUserName;
        }
    
    }
    

    Das Script prüft, ob der Text mit "Benutzer" beginnt und wenn ja, merkt es scih den Text danach in der statischen Variable lastUserName und dessen Wert wird immer als LastUserNameCol ausgegeben. Ergebnis sieht dann so aus:

     

    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort markiert Stephan, W Freitag, 27. Dezember 2013 16:22
    Freitag, 27. Dezember 2013 14:39

Alle Antworten

  • Das Schlagwort dürfte wohl "Normalisierung" sein.

    Du solltest das Flat File zuerst mal in normalisierte Form bringen, also Users und Applications und dann die Verbindungsentität UserApplications füllen.

    Dannach kannst Du einen Report, wie von Dir gewünscht erzeugen.

    Gruss

    Henry

    Freitag, 27. Dezember 2013 03:52
  • Hallo Stephan,

    eine eher ungewöhnliche Anforderung aber durchaus einfach zu lösen und zwar mit eine Script-Komponente vom Typ "Transformation".

    Also, einmal ein SSIS Package mit einem Datenfluss-Task anlegen, dort dann eine Flatfile Quelle einfügen und eine "Script-Komponent", auf Nachfrage dann Type = Transformation auswählen, zum Schluß noch die gewünschte Quelle.

    In den Eigenschaften der "Script Componente" musst Du die Eingabespalten festlegen (bei mir InputCol benannt) und eine neue Ausgabespalte anlegen, bei mir habe ich sie "LastUserNameCol" genannt. Dann noch das Script selbst bearbeiten, da muss Du nur den nachfolgenden Code in der bereits angelegten Methode "Input0_ProcessInputRow" einfügen sowie die eine Variablendeklaration von lastUserName.

    [Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
    public class ScriptMain : UserComponent
    {
        
        private static string lastUserName;
    
        public override void Input0_ProcessInputRow(Input0Buffer Row)
        {
            if (Row.InputCol.StartsWith("Benutzer"))
            {
                lastUserName = Row.InputCol.Substring(8).Trim();
            }
    
            Row.LastUserNameCol = lastUserName;
        }
    
    }
    

    Das Script prüft, ob der Text mit "Benutzer" beginnt und wenn ja, merkt es scih den Text danach in der statischen Variable lastUserName und dessen Wert wird immer als LastUserNameCol ausgegeben. Ergebnis sieht dann so aus:

     

    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort markiert Stephan, W Freitag, 27. Dezember 2013 16:22
    Freitag, 27. Dezember 2013 14:39
  • Besten Dank für deine Antwort.

    Freitag, 27. Dezember 2013 16:23