2016-07-28 20 views
0

Ich habe eine SQL-Anweisung (SQL Server 2014), die XML-formatierte Daten erstellt. Ich ziehe das in eine SSIS (2013) Objektvariable. Wenn ich das SQL in einen Datenfluss-Task lege, um in eine Textdatei zu gehen, funktioniert es. ABER, kein Kodierungsheader. Aufgrund der Größe der Rückgabedaten ist die Konvertierung in NVARCHAR keine Option - Daten würden abgeschnitten.Verwenden der SSIS-Script-Task zum Lesen von XML aus dem Variablenobjekt LoadXml schlägt fehl

Also, stattdessen habe ich eine SQL-Aufgabe, die gleiche Abfrage: ResultSet = XML; Variable datentyp = Objekt (es schlägt fehl, wenn ich versuche zu string)

Also, nach viel Zeit hier - ich fand alle Arten von großartigen Sachen XmlWriter und XmlWriterSettings zu verwenden. Wunderbar großartig. ABER - Ich kann die Skript-Aufgabe (C#) nicht dazu bringen, das XML-Objekt korrekt zu lesen (oder zu formatieren/zu definieren). Ich bekomme immer einen "DTS-Skript-Task hat eine Ausnahme im Benutzercode festgestellt"

Ich legte einen Haltepunkt an der LoadXML-Anweisung - verifiziert die Variable hat die XML-Daten - tho interessanterweise wird umgeben von .... Im Debug-Modus ist der spezifische Fehler "Daten auf der Root-Ebene ist ungültig. Zeile 1, Position 1."

Es löst die Ausnahme bei der LoadXML-Anweisung - was fehlt mir? Muss ich das XML-Layout (Felder) definieren? Die auskommentierte Testzeichenfolge funktioniert ohne Ausgabe. kein Fehler. Überschrift geschrieben.

Irgendwelche Ideen?

Update: Es schlägt auch mit einer Zeichenfolge-Version meiner Testdaten, ohne das Stamm-Tag.

public void Main() 
     { 

      Variables varCollection = null; 
      Dts.VariableDispenser.LockForWrite("User::PCC_XML"); 
      Dts.VariableDispenser.GetVariables(ref varCollection); 

      XmlDocument xdoc = new XmlDocument(); 

      XmlWriterSettings settings = new XmlWriterSettings 
      { 
       Encoding = Encoding.UTF8, 
       ConformanceLevel = ConformanceLevel.Document, 
       OmitXmlDeclaration = false, 
       CloseOutput = true, 
       Indent = true, 
       IndentChars = " ", 
       NewLineHandling = NewLineHandling.Replace 
      };  

      xdoc.LoadXml(varCollection["User::PCC_XML"].Value.ToString()); 

      //xdoc.LoadXml("<xml><foo></foo></xml>"); 

      using (StreamWriter sw = File.CreateText("C:\\test_xml.xml")) 
      using (XmlWriter writer = XmlWriter.Create(sw, settings)) 
      { 
       xdoc.WriteContentTo(writer); 
       writer.Close(); 
      }  

      Dts.TaskResult = (int)ScriptResults.Success; 
     } 

eine skinnied abgespeckte Version meiner XML ist (einschließlich der Wurzel, die hinzugefügt wurde) Sie haben

<ROOT> 
    <Universal_letters> 
     <Universal_letter> 
      <docID>123456</docID> 
      <Letter_Code>123</Letter_Code> 
      <Callback_Phone>1-888-111-111</Callback_Phone> 
      <Delivery_Methods> 
       <Delivery_Method /> 
       <Print_Queue /> 
      </Delivery_Methods> 
      <Requested_Date>2016-07-28</Requested_Date> 
      <Consumer_First_Name>Bubba</Consumer_First_Name> 
      <Consumer_Last_Name>Bubbster</Consumer_Last_Name> 
      <Consumer_Address_1>123 Street Way</Consumer_Address_1> 
     </Universal_letter> 
    </Universal_letters> 
</ROOT> 
+0

Sorry, ich bin nicht allzu vertraut mit xml so näherte ich Dies obwohl SQL. Im Folgenden finden Sie einige TSQL, die die Daten in 4000 Zeichenausgaben aufteilen. Mit dieser Logik können Sie dies in einer Schleife im Kontrollfluss des ssis-Pakets tun oder etwas ähnliches in C# tun. \t Entschuldigung, das ist als Kommentar nicht gut lesbar. \t deklarieren @v varchar (max) = '' deklariere @c int; @count = len (@v)/4000 setzen if (len (@v)% 4000> 0) @c = @c + 1 deklarieren @i int = @c while (@count> 0) beginne wähle substring (@ v, 0 + (4000 * (@ i- @ c)), 4000+ (4000 * (@ i- @ c))) setze @c = @c - 1 ende –

Antwort

0

versucht, den Abstand zwischen den XML-Elementen oder überprüft für alle Sonderzeichen zu entfernen. Ihr XML-Code ist in Ordnung und der C# -Code in der Skriptaufgabe erledigt auch seine Aufgabe. Ich habe das gleiche Szenario wie in der Abfrage beschrieben neu erstellt. Also ich denke, dass das Problem wirklich mit der tatsächlichen XML ist, die zur Laufzeit generiert und als Eingabe für die PCC_XML Variable festgelegt wird. In der Art, wie es in die Variable geschrieben wird, kann etwas faul sein. Einige Abstände oder Sonderzeichen können dazu führen, dass das Gleiche passiert. Bitte markieren Sie es als beantwortet, wenn es Ihnen hilft.

0

Ich konnte mein XML-Beispiel nicht wie Mohd vorgeschlagen zu arbeiten. Heute jedoch habe ich diese http://www.sql-server-performance.com/2013/export-to-xml-using-ssis/ gefunden (die eine Zeichenfolge als Ergebnismenge verwendet, und eine Skriptaufgabe & XML exportieren.) Kombiniert mit https://stackoverflow.com/a/14840090/4509043 - für die Codierung. Hat mich dahin gebracht, wo ich sein musste.

Interessanterweise hat die C# -Skriptaufgabe keine meiner großen XML-Daten abgeschnitten - im Gegensatz zu NVARCHAR (MAX). Das ist großartig! Es ist auch erwähnenswert, dass OLE DB-Verbindungen nicht funktionieren, es muss ADO.NET sein.

Endgültige Lösung: Benutzer :: PCC_XML ist ein String-Datentyp. Der SQL-Task hat einreihige Ergebnisse - XML-Typ.

Mein final - Arbeits C# -Code ist:

vor Namespace declare - mit anderen Namensräumen

using System.Xml; //added - for xml 
using System.Text; //added - for Encoding 
using System.IO; // added - for file writing 

Haupt proc

public void Main() 
     { 

      XmlDocument xdoc = new XmlDocument(); 

      // will ensure that XML exported will have opening tag 
      // <?xml version="1.0" encoding="UTF-8"?> 
      XmlWriterSettings settings = new XmlWriterSettings 
      { 
       Encoding = Encoding.UTF8, 
       ConformanceLevel = ConformanceLevel.Document, 
       OmitXmlDeclaration = false, 
       CloseOutput = true, 
       Indent = true, 
       IndentChars = " ", 
       NewLineHandling = NewLineHandling.Replace 
      }; 

      // strip out the <root> </root> tags on insert into string 
      string strXML = Dts.Variables["User::PCC_XML"].Value.ToString().Replace("<ROOT>", "").Replace("</ROOT>", ""); 

      xdoc.LoadXml(strXML.ToString()); 

      // test destination 
      using (StreamWriter sw = File.CreateText("C:\\test_xml.xml")) 
      using (XmlWriter writer = XmlWriter.Create(sw, settings)) 
      { 
       xdoc.WriteContentTo(writer); 
       writer.Close(); 
      } 

      Dts.TaskResult = (int)ScriptResults.Success; 
     }