This blog post has also been published in English.

Nachdem wir uns mit dem Import von Daten aus Flatfiles befasst haben, ist es nun Zeit, Daten mittels Biml in Flatfiles zu exportieren!

Hierfür legen wir zunächst einen Verweis auf unsere Quelldatenbank, wie gehabt AdventureWorks2014, an:

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
		<Connections>
        	<OleDbConnection Name="Source" ConnectionString="Data Source=localhost;initial catalog=Adventureworks2014;provider=SQLNCLI11;integrated security=SSPI"></OleDbConnection>
		</Connections>
</Biml>

Im nächsten Schritt durchlaufen wir alle Tabellen dieser Datenbank (gerne können Sie mittels GetDatabaseSchema das Ergebnis einschränken) und erzeugen jeweils ein FlatFileFormat. Hierbei berücksichtigen wir alle Spalten mit Ausnahme derer mit Typ Binary oder Object und weisen ihnen den Datentyp eines String mit maximaler Länge zu. Das Format spielt für den Export schließlich keine Rolle. Zusätzlich fügen wir Annotations für den ursprünglichen Tabellennamen, die verwendeten Spalten sowie die Primärschlüssel hinzu (Letztere benötigen wir in einem späteren Schritt!).

<#@ template language="VB" #>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <FileFormats>
        <# Dim SourceConnection as AstDbConnectionNode  = RootNode.Connections("Source") 
	   Dim Delimiter as string 
       Dim Columns as string
	   Dim KeyColumns as string
   Dim SrcTableResults as ImportResults = SourceConnection.GetDatabaseSchema
   for each tbl as asttablenode in srctableresults.tablenodes 
   Columns =""
   KeyColumns = ""#>
        <FlatFileFormat Name="<#= tbl.schema  #>_<#= tbl.name #>" ColumnNamesInFirstDataRow="true">
            <Columns>
                <# for each col as asttablecolumnbasenode in tbl.columns.where(function(c) not (c.Datatype = system.data.dbtype.Binary or c.Datatype = system.data.dbtype.Object) ) 
                   if Columns <> "" then columns = Columns + ", "
                   columns = columns + "[" + col.name + "]"
				   if col.IsUsedInPrimaryKey = true then
				   		if KeyColumns <> "" then KeyColumns = KeyColumns + ", "
                   		KeyColumns = KeyColumns + "[" + col.name + "]"
				   end if
				   Delimiter =","
				   if col.name = tbl.columns.last.name then Delimiter = "CRLF"  #>
                <Column Name="<#= col.name #>" DataType="String" Length="-1" Delimiter="<#= delimiter #>"/>
                  <# next 
					 if KeyColumns = "" then KeyColumns = "1"#>
            </Columns>
            <Annotations>
                <Annotation AnnotationType="Tag" Tag="Sourcetable"><#= tbl.scopedname #></Annotation>
                <Annotation AnnotationType="Tag" Tag="Sourcecolumns"><#= columns  #></Annotation>
				<Annotation AnnotationType="Tag" Tag="Keycolumns"><#= KeyColumns  #></Annotation>
            </Annotations>
        </FlatFileFormat>
        <# next #>
    </FileFormats>
</Biml>

Wie Sie bereits wissen, benötigen wir bei Flatfiles in Biml ein Format (welches wir gerade definiert haben) sowie eine Verbindung. Die Verbindungen erzeugen wir in einer Schleife über die Formate:

<#@ template language="VB" tier="2" #>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<Connections>
	<# for each ff as AstFlatFileFormatNode in rootnode.flatfileformats #>
		<FlatFileConnection Name="<#=ff.name #>" FileFormat="<#=ff #>" FilePath="C:\Flatfiles\Output\<#=ff.name #>.csv"  />
	<# next #>
</Connections>
</Biml>

Der letzte Schritt ist der eigentliche Export der Daten. Dies erledigen wir in einem einzelnen Paket, welches alle Tabellen parallel ausgibt:

<#@ template language="VB" tier="3" #>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
	<Packages>
		<Package Name="Export_Flatfiles">
			<Tasks>
			<# for each ff as AstFlatFileFormatNode in rootnode.flatfileformats #>
				<Container Name="Export <#=ff #>">
					<Tasks>
						<Dataflow Name="DF <#=ff #>">
							<Transformations>
								<OleDbSource Name="SRC <#=ff #>" ConnectionName="Source">
									<DirectInput>SELECT <#= ff.gettag("Sourcecolumns") #> FROM <#= ff.gettag("Sourcetable") #></DirectInput>
                                </OleDbSource>
								<FlatFileDestination ConnectionName="<#= ff #>" Name="<#=ff #>" />								
                            </Transformations>
						</Dataflow>
                    </Tasks>
				</Container>
			<# next #>
			</Tasks>
        </Package>
    </Packages>
</Biml>

Das Ergebnis ist eine CSV Datei je Tabelle in der AdventureWorks Datenbank!

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!