dimarts, 30 d’agost de 2016

Speaker al SQL Saturday #586 Madrid

Avui m'han confirmat seré speaker al SQL Saturday #586 a Madrid el proper 24 de setembre!
Serà la primera vegada que presento en un congrés d'informàtica i espero que no sigui l'última.

La ponència que presentaré serà: "Extracción automàtica de datos mediante BIML" on expicaré com generar la metadata i els dtsx mitjançant BIML per a extreure dades d'orígens com SQL Server, Excels, fitxers plans. Bàsicament el que he estat escrivint en els posts anteriors.

Ens veiem el 24!

dimecres, 17 d’agost de 2016

ADEU-BIML: Text File (II)

Després de massa temps sense escriure continuarem amb la generació dels dtsx per carregar TextFiles. En l'anterior post (http://www.eljordifabi.tech/2016/07/adeu-biml-text-file.html) vam veure com generar la metadata.
El primer punt diferencial respecte la resta d'orígens de dades és la creació de la connexió. Anem a explorar el fitxer UT_generateConnections.biml

En la definició de FlatFileConnection hi ha l'atribut FileFormat. Aquest atribut fa referència al tag FileFormats de final de tot del fitxer. Dins de FileFormats es defineixen les diferents columnes que tindran els fitxers i també atributs com poden ser el separador de columnes i de files, si té capçalera, etc. Tots aquests atributs els recuperarem de la metadata generada. Cal tenir en compte els tipus de separadors que accepta BIML i com escriure'ls
 case row_delimiter when '{CR}{LF}' then 'CRLF' when '{CR}' then 'CR' when '{LF}' then 'LF' when ';' then 'Semicolon' when ',' then 'Comma' when 'tab' then 'Tab' when '|' then 'VerticalBar' else row_delimiter end as row_delimiter
  
Per a completar el tipus de dades utilitzarem la funció UT_SQLServer_datatype.SQLServerToBimlDatatype que està al fitxer: UT_SQLServer_datatype.cs que fa la traducció de SQLServer a tipus de dades BIML.
Un cop definides les  FlatFileConnection amb els siure FileFormats ja es pot utilitzar la connexió.

En el nostre cas tenim l'opció de carregar un fitxer, o bé, carregar tots els fitxers d'una carpeta que continguin un patró en el nom. En el cas de carregar només un fitxer a l'espression de la connectionString hi haurà el path i el nom del fitxer, però al carregar els fitxers d'una carpeta hi haurà la variable que es farà servir dins del bucle.En el primer cas l'expression és opcional, en el segon és obligatòria.

<FlatFileConnection Name="<#= _table["source_name"] #>" FileFormat="<#= _table["source_name"] #>" FilePath="<#=  _dbtable["connectionString"]  #>" >
    <# if (_param &&  (_packageName!="LoadData" || Convert.ToInt32( _dbtable["isFolder"]) ==0)) { #> <!-- o no és folder -->
        <Expressions>
            <Expression ExternalProperty="ConnectionString">@[$Project::<#= _table["source_name"] #>_Path]+@[$Project::<#= _table["source_name"] #>_File]</Expression>
        </Expressions>
    <# } #>
    <# if (_packageName=="LoadData" && Convert.ToInt32( _dbtable["isFolder"]) !=0) { #> <!-- i és folder -->
        <Expressions>
            <Expression ExternalProperty="ConnectionString">@[User::File]</Expression>
        </Expressions>
    <# } #>
</FlatFileConnection>


El següent fitxer a explorar és LoadDataFlatFiles.biml 
En aquest fitxer es completa el dataFlow per a carregar les dades del fitxer a l'Staging Area. L'estructura és:
1) Truncar la taula de l'staging Area
2) Recórrer tots els fitxers si és una carpeta o un sol fitxer
3) Llegir el fitxer
4) Comptar les files llegides
5) Bolcar les dades a l'staging Area
6) Escriure les files carregades a la taula de Log

En cas de voler carregar les dades d'una carpeta utilitzarem el ForEachFileLoop.
<ForEachFileLoop Name="FL_file_loop" ConstraintMode="Linear" Folder="<#= _tableTD["path"] #>" FileSpecification="<#= _tableTD["pattern"] #>"
                            ProcessSubfolders="<#= _tableTD["traverse_subfolders"] #>" RetrieveFileNameFormat="FullyQualified">
    

i guardarem el valor de la connectionString a la variable File
<Variables>
    <Variable Name="File" DataType="String"></Variable>
</Variables>
<VariableMappings>
    <VariableMapping Name="0" VariableName="User.File"  />
</VariableMappings>

Aquest és l'únic punt diferent respecte la resta de càrregues.

Amb això ja podem generar els nostres paquets dtsx. Com sempre, tot el detall del codi el podeu trobar al github: https://github.com/jordiisidro/adeu-biml/ 

Amb aquest post s'acaba una primera sèrie on hem generat la metadata i els fitxers dtsx per carregar una BBDD SQL Server, un fitxer Excel (podent recòrrer les seves pestanyes dinàmicament) i un fitxer pla.