none
SSIS Exec SQL Task: Fehler bei einem aus mehreren Schritten bestehenden OLE-DB-Vorgang RRS feed

  • Frage

  • Ich versuche gerade, ein Beispiel aus einem Buch  über SSIS-programmierung nachzuvollziehen und für meine Zwecke zu modifizieren:

    in einem Execute-SQL-Task wird auf eine Abfrage einer Access2007-DB zugegriffen und das Resultset in eine Variable vom Typ Obejct geschrieben.

    Wenn ich per Build Query den SQL-text teste, erhalte ich die richtigen Datensaätze.

    Beim Durchlauf erhlate ich eine Warnung 0x0;: Fehler bei einem aus mehreren Schritten bestehenden OLE-DB-Vorgang

    Das Paket läuft aber weiter und der Exec-SQL-Schritt wird grün

    Ich würde das ja übergehen, aber da der nächste Schritt dann fehlschlägt diese Frag und gleich auch der Verweis auf meinen nächsten Beitrag.

     

    By the way: Wie kann ich den Inhalt der Variable mit dem Resultset testen, ob diese Variable dann auch tatsächlich den gwünschten Inhalt hat ?

    Dienstag, 9. August 2011 16:08

Antworten

  • Hallo Stefan,

    wie man dem anderen (suboptimal durch Hinweis "verlinktem") Thread entnehmen kann, geht es hier nicht um eine For Each (VB.net) / foreach (C#) Anweisung, sondern um ein SSIS (Integration Services) Paket mit einem Foreach-Schleifencontainer (http://msdn.microsoft.com/de-de/library/ms141724.aspx) und in einem SSIS Paket ist wirklich fast alles Klicki-Bunti und nur selten mal etwas gecoded. Und durchs Zusammenklicken entsteht nicht wirklich Code, sondern "nur" XML mit den Metadaten, das der Task ausführen soll.

     

    Hallo NicoNi,

    wenn ich das bei mir nachbaue (inkl. Access MDB als Quelle), funktioniert es einwandfrei und bisher ohne irgendwelche Problem bzgl. Konvertierung oder so.
    Die Variablen hatte ich mit verschiedenen Typen angelegt, z.B. einen "Long Integer" auf ich auf eine Int32 Variable gemappt; geht.

    Hier mal etwas beschrieben, wie ich das Paket angelegt habe:


    "SQL ausführen"
    Allgemein: ResultSet = Vollständiges Resultset
    ResultSet: Ergebnisname = 0 => User:Variable  (vom Typ Objekt)
    Dazu natürlich die "Connection" und die Abfrage, wo natürlich die Feldnamen explizit aufgeführt sind, also kein SELECT *.


    "Foreach-Schleifencontainer"
    Auflistung: Enumertor = "Foreach-ADO-Enumerator"
    Auflistung: ADO-Objektquellvariable: = User:Variable
              + "Zeilen in der ersten Tabelle

    Variablenzuordnung:
    Unter "Variable" gibst Du die Variable an, in die der Skalar-Wert geschrieben werden soll.
    Unter "Index" gibst Du den 0-Based Index aus dem Resultset an, d.h. willst Du der Variable das zweite Feld vom Resultset aus "SQL ausführen" als Wert zuweisen, dann gibst Du hier eine 1 an. Die Reihenfolge ist dabei egal; dafür verwendet man ja den Index-Wert.

    Im Foreach Container habe ich ein Script-Task (http://msdn.microsoft.com/de-de/library/ms141752.aspx) mit einem einfachen

    MessageBox.Show(Dts.Variables("MeineVariable").Value)) 
    

    angelegt, das mir die Werte zur Kontrolle anzeigt (das war ja auch eine Teilfrage aus dem anderen Thread).


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Mittwoch, 10. August 2011 13:41

Alle Antworten

  • Ein for-each-loop erhält Daten aus einer object-Variable (siehe mein anderes Posting).

    Nun versuche ich die verschiedenen SPalten auf Variablen zu mappen. Die Spaltennumme entnehme ich 0-basiert aus der Exceute-SQL-Anweisung (siehe oben)

    Leider erhlate ich trotz (vermeintlich) richtiger Variablentypen für jede Spalte eine Fehlermeldung, z.B. für eine Spalte mit einem long-Wert in der Access-DB 0xC001F009.

    Ich habe schon wirr herumprobiert mit Var-Typen, hat aber bisher alles nichts gebracht

    Dienstag, 9. August 2011 16:13
  • Hi,

    und wo ist der Code, mit dem Du das versucht hast? Ohne den wird man hier nicht wirklich helfen können.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Dienstag, 9. August 2011 16:50
    Moderator
  • Da ich mir den for-each-loop zusammenklicke, habe ich keinen Code.

    Es geht auch primär um den fro-each-loop und dessen Variablen-mapping.

    Aber ich bin inziwschen einen kleinen Schritt weiter:

    Im ersten Anlauf hatte ich die Variablen nicht in der reihenfolge ihres Index angegeben;

    also etwa so:

    Var1         5

    Var2         1

    Var3         6

    usw.

    Das scheint nicht zu funktionieren.

    Jetzt habe ich  die reihenfolge so geändert, dass alle brav hintereinander kommen; also Index 0, 1, 2 ....

     

     

    Mittwoch, 10. August 2011 06:18
  • Hi,

    Da ich mir den for-each-loop zusammenklicke, habe ich keinen Code.

    wo bitte kann man sich im SQL Server eine "For-Each-Loop" zusammenklicken?

    Es geht auch primär um den fro-each-loop und dessen Variablen-mapping.

    Öhm. Ja. Aber dafür müsste man wissen, was genau Du da eigentlich machst. Und dazu braucht man den Code. Sei es der selbstgeschriebene oder auch der, der vom "Zusammenklicker" Tool erzeugte Code.

    Deine Angaben sagen mir persönlich gar nichts. Soll heißen: Ich wüsste nicht mal, was Du da eigentlich wo machst. Daher bitte mal detaillierter beschreiben, in welchem Tool Du was genau wie machst.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Mittwoch, 10. August 2011 06:53
    Moderator
  • Hallo NicoNi,

    das kann ich soweit nachvollziehen. Wenn ich eine Access Datei (MDB) als Datenquelle für ein "SQL ausführen" Task (http://msdn.microsoft.com/de-de/library/ms141003.aspx) verwende, bekomme ebenfalls zwei dieser Warning.

    Aber der Task läuft sonst fehlerfrei durch, die Datensätze werden vollständig eingelesen und auch an die angegebene Variable übergeben.
    Der folgende Task wie ein ForEach Container kann die Werte aus der Variable auch fehlerfrei & vollständig einlesen und abarbeiten ... sofern dieser Task selbst fehlerfrei angelegt ist.

    To be continued in you other thread (hättest Du vielleicht doch zusammenhängen in einem Thread posten sollen).

     


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Mittwoch, 10. August 2011 13:29
  • Hallo Stefan,

    wie man dem anderen (suboptimal durch Hinweis "verlinktem") Thread entnehmen kann, geht es hier nicht um eine For Each (VB.net) / foreach (C#) Anweisung, sondern um ein SSIS (Integration Services) Paket mit einem Foreach-Schleifencontainer (http://msdn.microsoft.com/de-de/library/ms141724.aspx) und in einem SSIS Paket ist wirklich fast alles Klicki-Bunti und nur selten mal etwas gecoded. Und durchs Zusammenklicken entsteht nicht wirklich Code, sondern "nur" XML mit den Metadaten, das der Task ausführen soll.

     

    Hallo NicoNi,

    wenn ich das bei mir nachbaue (inkl. Access MDB als Quelle), funktioniert es einwandfrei und bisher ohne irgendwelche Problem bzgl. Konvertierung oder so.
    Die Variablen hatte ich mit verschiedenen Typen angelegt, z.B. einen "Long Integer" auf ich auf eine Int32 Variable gemappt; geht.

    Hier mal etwas beschrieben, wie ich das Paket angelegt habe:


    "SQL ausführen"
    Allgemein: ResultSet = Vollständiges Resultset
    ResultSet: Ergebnisname = 0 => User:Variable  (vom Typ Objekt)
    Dazu natürlich die "Connection" und die Abfrage, wo natürlich die Feldnamen explizit aufgeführt sind, also kein SELECT *.


    "Foreach-Schleifencontainer"
    Auflistung: Enumertor = "Foreach-ADO-Enumerator"
    Auflistung: ADO-Objektquellvariable: = User:Variable
              + "Zeilen in der ersten Tabelle

    Variablenzuordnung:
    Unter "Variable" gibst Du die Variable an, in die der Skalar-Wert geschrieben werden soll.
    Unter "Index" gibst Du den 0-Based Index aus dem Resultset an, d.h. willst Du der Variable das zweite Feld vom Resultset aus "SQL ausführen" als Wert zuweisen, dann gibst Du hier eine 1 an. Die Reihenfolge ist dabei egal; dafür verwendet man ja den Index-Wert.

    Im Foreach Container habe ich ein Script-Task (http://msdn.microsoft.com/de-de/library/ms141752.aspx) mit einem einfachen

    MessageBox.Show(Dts.Variables("MeineVariable").Value)) 
    

    angelegt, das mir die Werte zur Kontrolle anzeigt (das war ja auch eine Teilfrage aus dem anderen Thread).


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Mittwoch, 10. August 2011 13:41
  • Es scheint jetzt zu funktionieren.

    Den Druchbruch hat - wie oben bereits beschrieben - die Umgruppierung der Variablen-Zuordnungen  gebracht.

    Es scheint nicht nur wichtig zu sein, die richtigen Variablen über deren index zuzuordnen, sondern SSIS legt scheinbar auch noch Wert darauf, dass dies in aufsteigender index-Folge passiert.

    Mittwoch, 10. August 2011 14:34
  • sondern SSIS legt scheinbar auch noch Wert darauf, dass dies in aufsteigender index-Folge passiert.


    Hallo NicoNi,

    ich hatte es extra getestet, die Reihenfolge der Index-Werte in der Variablenauflistung ist egal, die kann man angeben wie man will. Wichtig ist nur, das man keinen verwendet, den es im ResultSet nicht gibt.


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Mittwoch, 10. August 2011 14:40