Massenänderungen mit Templates in Biml mittels Biml-XML

Massenänderungen mit Templates in Biml mittels Biml-XML

This blog post has also been published in English.

Vielleicht haben Sie unseren kürzlich veröffentlichen Beitrag über Bulk changes to Tasks in BimlExpress gelesen.
Hier hatten wir an einem kleinen Beispiel aufgezeigt, wie Sie das Biml Objektmodell nutzen können um globale Einstellungen wie DefaultBufferMaxRows zu setzen.

Über den gleichen Ansatz könnten Sie auch Spalten, Events, Transformierungen und vieles mehr hinzufügen. Ab einem gewissen Punkt werden Sie allerdings bemerken, wie sehr Sie die Möglichkeit des Designs mittels Biml XML Elementen vermissen.
In BimlStudio wäre das über Transformer möglich – ein Feature das es in BimlExpress jedoch nicht gibt. Es gibt jedoch Mittel und Wege sich dennoch das Leben etwas leichter zu machen!

Um uns ganz auf den Teil mit den Templates konzentrieren zu können, erstellen wir uns zunächst statisch eine Verbindung, eine Datenbank, ein Schema, zwei Tabellen sowie zwei Pakete, damit wir die Templates danach auch auf etwas anwenden können:

 <Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        <OleDbConnection Name="Target" ConnectionString="Provider=SQLNCLI11;Server=localhost;Initial Catalog=TargetDB;Integrated Security=SSPI;"/>
    </Connections>
    <Databases>
        <Database Name="Target" ConnectionName="Target"/>
    </Databases>
    <Schemas>
        <Schema Name="dbo" DatabaseName="Target"/>
    </Schemas>
    <Tables>
        <Table Name="MyTable_1" SchemaName="Target.dbo">
            <Columns>
                <Column Name="Col_1" DataType="String" Length="50" />
                <Column Name="Col_2" DataType="String" Length="50" />
            </Columns>
        </Table>
        <Table Name="MyTable_2" SchemaName="Target.dbo">
            <Columns>
                <Column Name="Col_1" DataType="String" Length="50" />
                <Column Name="Col_2" DataType="String" Length="50" />
            </Columns>
        </Table>
    </Tables>
    <Packages>
        <Package Name="Package_1"/>
        <Package Name="Package_2"/>
    </Packages>
</Biml>

Gehen wir davon aus, wir möchten die Templatefunktion nutzen um Spalten zu Tabellen sowie Events zu Paketen hinzuzufügen (Dies ist im Übrigen der größte Nachteil dieses Ansatzes – er funktioniert nicht automatisch global, sondern muss einmalig für jeden Objekttyp definiert werden).
Hierfür legen wir in einer weiteren Biml Datei eine Tabelle mit einer neuen Spalte sowie ein Paket mit einem Event an:

 <Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Tables>
        <Table Name="TemplateTable" SchemaName="Target.dbo">
            <Columns>
                <Column Name="Load_TimeStamp" DataType="DateTime"/>
            </Columns>
        </Table>
    </Tables>
    <Packages>
        <Package Name="TemplatePackage">
            <Events>
                <Event Name="MyEvent" EventType="OnPostExecute">
                    <Tasks>
                        <ExecuteSQL Name="PostExecute SP" ConnectionName="Target">
                            <DirectInput>
                                <!-- Your Code Here! -->
                            </DirectInput>
                        </ExecuteSQL>
                    </Tasks>
                </Event>
            </Events>
        </Package>
    </Packages>
</Biml> 

Nun müssen wir nur noch die Templates mit den Basisdaten zusammenführen.
Hierfür loopen wir zunächst über alle Tabellen außer der TemplateTable und fügen alle in ihr enthaltenen Spalten zu den anderen Tabellen hinzu.
Danach loopen wir über alle Pakete außer dem TemplatePackage und fügen dort wiederum die Events aus dem Template hinzu.

Um weitere Objekte oder Eigenschaften per Template zu verteilen, müsste für diese lediglich eine weitere Iteration hinzugefügt werden:

 <#@ template language="VB" optionexplicit="False" tier="999"#>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <# for each tbl in RootNode.Tables.Where(Function(c) c.Name <> "TemplateTable") 
		for each col in RootNode.Tables("TemplateTable").Columns 
		 	if tbl.Columns.Where(function(c) c.Name = col.Name).Count = 0 then tbl.Columns.add(col)
		next
	next 
	   
	for each pack in RootNode.Packages.Where(Function(c) c.Name <> "TemplatePackage") 
		for each eve in RootNode.Packages("TemplatePackage").Events 
		 	if pack.events.Where(function(c) c.Name = eve.Name).Count = 0 then pack.Events.add(eve) 
        next
	next #>
</Biml>
 

Das war es auch schon – nun sollten alle Pakete den PostExecute Event aus dem Template beinhalten und alle Tabellen über die Timestamp Spalte verfügen.

Haben Sie hierzu Fragen oder Anmerkungen? Wir freuen uns auf Ihren Input unter biml@solisyon.de!

Weitere Informationen zu Biml, einschließlich Terminen und Blog Beiträgen finden Sie auch auf unserer Biml Seite.

Viel Spaß beim Biml’n!

Facebook