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>
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 –