Immer häufiger hört man von Biml – doch was ist das überhaupt? Diese Frage wollen wir hier ein wenig aufklären.

Eines vorab: Mit Biml lassen sich viele Themen im Bereich Business Intelligence lösen, dieser Artikel beschränkt sich zunächst auf den Bereich SQL Server Integration Services.

Biml steht für Business Intelligence Markup Language – es handelt sich somit um eine Markup Sprache (also XML) zur Erstellung von BI Objekten wie beispielsweise Integration Services Paketen.
Biml wurde und wird von Varigence (www.varigence.com) entwickelt, es gibt verschiedene Frontends zur Erstellung und Kompilierung von Biml Paketen.

Diese sind unter anderem:

BIDS Helper (kostenfreies Plugin für BIDS bzw. die SQL Server Data Tools)
BimlOnline (derzeit im Beta Stadium und daher aktuell ebenfalls kostenfrei)
Mist (von Varigence entwickelter Full-Client)
– BimlFlex (Enterprise Framework zur Erstellung hoch komplexer Biml Lösungen in Großunternehmen)

Die verschiedenen Frontends unterscheiden sich teilweise deutlich in ihrem Leistungsumfang. So erlaubt Mist beispielsweise unter Nutzung von MSBuild die Erstellung oder Aktualisierung von Paketen per Kommandozeile oder Batchfile. Welcher Client bzw. welches Lizenzmodell sich anbietet unterscheidet sich somit im Einzelfall.

Durch die Möglichkeit in Biml Paketen, über sogenanntes BimlScript in C# oder VB.NET, mit Programmcode zu arbeiten sind die Anwendungsfälle fast unbegrenzt. Je stärker sich Themen standardisieren lassen oder sich entsprechende Muster finden (Beispielsweise das Löschen und Befüllen einer Tabelle der Staging Umgebung mittels TRUNCATE und DataFlow Task), desto effizienter wird die Entwicklung durch Biml.

Ein einfacher Biml Code könnte wie folgt aussehen:

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
	 <Packages> 
		<Package Name="HelloBiml"/>	 	
	 </Packages> 
</Biml>

Dieser würde wiederum lediglich ein leeres SSIS Paket namens HelloBiml.dtsx erzeugen. In der Realität vielleicht nicht sehr sinnvoll – es macht jedoch deutlich, wie einfach und vor allem logisch (insbesondere für SSIS Spezialisten) der Aufbau ist.

Die Grundlogik einer Biml Lösung orientiert sich effektiv genau an der eines SSIS Pakets. Die erforderlichen Informationen (Verbindungen, Tabellen etc.) werden in Form von Meta-Daten an- bzw. abgelegt, was automatisiert oder manuell erfolgen kann. Auf dieser Basis lassen sich dann wiederum die entsprechenden Pakete erstellen, wobei Biml auch die entsprechenden Methoden zur Anlage und Wartung der zugrundeliegenden Tabellen mitliefert.


Abbildung: Grundmodell von Biml Meta-Daten

Die Kompilierung erfolgt dann wiederum durch die Biml Engine:


Abbildung: Biml Prozess Ablauf

Konkrete Anwendungsfälle und Vorgehensweisen würden den Rahmen dieses Beitrags sprengen – hierzu werden wir Ihnen in den kommenden Wochen und Monaten weitere Detailartikel zur Verfügung stellen. Um dennoch einen Eindruck zu bekommen, mit welch einfachen Mitteln sich einiges erreichen lässt, hier noch ein Beispiel.

Dazu ist es wichtig zu verstehen, dass BimlScript auf Objekten basiert. Hier verwenden wir die Collection RootNode.Tables (welche die Summe aller Tabellen in den Biml-Metadaten darstellt) sowie jede Tabelle vom Typ AstTableNode innerhalb dieser Collection um wiederum ein Paket namens “02_Populate_Tables.dtsx” zu erstellen, welches für jede der Tabellen einen Sequenz-Container anlegt, welcher zunächst einen TRUNCATE durchführt um danach eine komplette Neubeladung per DataFlow-Task durchzuführen:

<#@ template tier="4" language="VB" #>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
	<Packages>
		<Package Name="02_Populate Tables" ConstraintMode="Parallel">
			<Tasks>
			<# for each table as asttablenode in RootNode.Tables  #>
				<Container Name="Copy <#=table.Schema.Name#>_<#=table.Name#>" ConstraintMode="Linear">
					<Tasks>
						<ExecuteSQL Name="Truncate" ConnectionName="Target">
							<DirectInput>truncate table  <#=table.ScopedName#></DirectInput>
						</ExecuteSQL>
						<Dataflow Name="Copy <#=table.Schema.Name#>_<#=table.Name#>">
							<Transformations>
								<OleDbSource Name="Retrieve Rows" ConnectionName="AdventureWorks">
									<DirectInput>SELECT <#=table.GetColumnList()#> FROM <#=table.GetTag("SourceSchemaQualifiedName")#></DirectInput>
								</OleDbSource>
								<OleDbDestination Name="Load Rows" ConnectionName="Target">
									<TableOutput TableName="<#=table.ScopedName#>" />
								</OleDbDestination>
							</Transformations>
						</Dataflow>
					</Tasks>
				</Container>
			<# next #>
			</Tasks>
		</Package> 
	</Packages>
</Biml>

Dieser Code wiederum könnte durch wieder verwendbare Code-Bausteine und Funktionen vereinfacht werden.

Nun muss man sich vorstellen, dass man diese Funktionalität zur Beladung hunderter Tabellen nutzt. Möchte man einen entsprechenden Logging-Task in jedem Container einbauen ist das mit Biml ein einmaliger Vorgang – manuell wäre der Aufwand im Bereich mehrerer Stunden oder gar Tage!

Dies ist natürlich nur die berühmte Spitze des Eisbergs – wir hoffen dennoch, dass Ihnen etwas deutlicher geworden ist, was Biml eigentlich ist und welche Potenziale darin liegen.

Haben Sie hierzu Fragen oder Anmerkungen? Wir freuen uns auf Ihren Input unter !

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

Viel Spaß beim Biml’n!