Biml SSIS Foreach Nodelist Container (aka Shred XML in SSIS)
Every time I look at my ForEach NodeList Enumerator post, I struggle to remember how to do half of it. Plus, as I discovered today, I am inconsistent between my images. The Control Flow shows an XML structure of
<Files> <File>Foo.txt</File> <File>Bar.txt</File> <File>Blee.txt</File> </Files>but the text inside the Foreach loop would be for parsing an XML tree in this format
<Files> <FileName>Foo.txt</FileName> <FileName>Bar.txt</FileName> <FileName>Blee.txt</FileName> </Files>
The resulting package looks like this - a Foreach Enumerator that shreds the XML. We assign the shredded value into our variable CurrentNode. We pass that as an argument into a script task that does nothing but print the value as an Information event.
Configuration remains comparable to the previous post with the exception of using Variables.
Running the package generates Output like the following
Information: 0x0 at SCR Echo Back, SCR Echo Back: User::CurrentNode : Foo.txt Information: 0x0 at SCR Echo Back, SCR Echo Back: User::CurrentNode : Bar.txt Information: 0x0 at SCR Echo Back, SCR Echo Back: User::CurrentNode : Blee.txt
Biml
The following Biml will create a Foreach nodelist enumerator that shreds an XML recordset. We pass the current node variable into our script task that echoes the value back
<Biml xmlns="http://schemas.varigence.com/biml.xsd"> <Packages> <Package Name="Task_ForEachNodeListLoop"> <Variables> <Variable DataType="String" Name="CurrentNode"></Variable> <Variable DataType="String" Name="SourceXML"><![CDATA[<Files><File>Foo.txt</File><File>Bar.txt</File><File>Blee.txt</File></Files>]]></Variable> <Variable DataType="String" Name="OuterXPath"><![CDATA[/Files/File]]></Variable> <Variable DataType="String" Name="InnerXPath"><![CDATA[.]]></Variable> </Variables> <Tasks> <ForEachNodeListLoop Name="FENLL Shred XML" EnumerationType="ElementCollection" InnerElementType="NodeText" > <VariableInput VariableName="User.SourceXML" /> <VariableOuterXPath VariableName="User.OuterXPath" /> <VariableInnerXPath VariableName="User.InnerXPath" /> <VariableMappings> <VariableMapping VariableName="User.CurrentNode" Name="0" /> </VariableMappings> <Tasks> <Script ProjectCoreName="ST_EchoBack" Name="SCR Echo Back"> <ScriptTaskProjectReference ScriptTaskProjectName="ST_EchoBack" /> </Script> </Tasks> </ForEachNodeListLoop> </Tasks> </Package> </Packages> <ScriptProjects> <ScriptTaskProject ProjectCoreName="ST_EchoBack" Name="ST_EchoBack" VstaMajorVersion="0"> <ReadOnlyVariables> <Variable Namespace="User" VariableName="CurrentNode" DataType="String" /> </ReadOnlyVariables> <Files> <File Path="ScriptMain.cs" BuildAction="Compile">using System; using System.Data; using Microsoft.SqlServer.Dts.Runtime; using System.Windows.Forms; namespace ST_EchoBack { [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute] public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase { public void Main() { bool fireAgain = false; string message = "{0}::{1} : {2}"; foreach (var item in Dts.Variables) { Dts.Events.FireInformation(0, "SCR Echo Back", string.Format(message, item.Namespace, item.Name, item.Value), string.Empty, 0, ref fireAgain); } Dts.TaskResult = (int)ScriptResults.Success; } enum ScriptResults { Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success, Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure }; } } </File> <File Path="Properties\AssemblyInfo.cs" BuildAction="Compile"> using System.Reflection; using System.Runtime.CompilerServices; [assembly: AssemblyVersion("1.0.*")] </File> </Files> <AssemblyReferences> <AssemblyReference AssemblyPath="System" /> <AssemblyReference AssemblyPath="System.Data" /> <AssemblyReference AssemblyPath="System.Windows.Forms" /> <AssemblyReference AssemblyPath="System.Xml" /> <AssemblyReference AssemblyPath="Microsoft.SqlServer.ManagedDTS.dll" /> <AssemblyReference AssemblyPath="Microsoft.SqlServer.ScriptTask.dll" /> </AssemblyReferences> </ScriptTaskProject> </ScriptProjects> </Biml>
No comments:
Post a Comment