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.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE125v7gQ_DgkhgQUjI4Wz95047t2V1GrVnz_1JwPfhLm112CpgN08hAbVjEDvoHAeLgo-GqWiZkiDKvzLieqHL7_7uA0Q0mDTyakZrfQ1IZBgw6oOAlE9yzm21bHVZcADwGYOtc2uT7g/s1600/2016-04-21+18_20_27-so+-+Microsoft+Visual+Studio.png)
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