2016-09-28 3 views
0

Dans nos fichiers Biml, nous construisons un modèle de données dans le rootnode en utilisant la méthode GetDataSchema(). Les packages SSIS sont basés sur les tables et les colonnes du modèle.Supprimer des colonnes de Biml à partir de RootNode

Nous voulons être en mesure de supprimer une colonne du RootNode avant la compilation des packages. S'il vous plaît laissez-moi savoir comment cela pourrait être fait? La méthode RemoveRootNode(0 peut-elle être utilisée. Si c'est le cas. Comment? Je vous remercie.

Répondre

0

Vous pouvez juste exclude the column comme Cathrine montre si vous avez déjà matérialisé les tables dans la collection Tables. L'avantage de cette approche est que le schéma complet de votre table source est disponible au cas où quelqu'un aurait besoin des colonnes exclues. L'inconvénient est que tout le monde qui n'en a pas besoin doit répéter sa logique d'exclusion.

L'autre route serait de le gérer lorsque vous importez vos données mais avant d'en faire une collection de tables. Même tour de Cathrine, juste à un endroit différent

En supposant que vous ayez deux fichiers. La première est Environment.biml qui ressemble à

<Biml xmlns="http://schemas.varigence.com/biml.xsd"> 
    <Connections> 
     <Connection Name="CMAdventureWorks2014" ConnectionString="Provider=SQLNCLI11;Data Source=localhost\dev2014;Integrated Security=SSPI;Initial Catalog=AdventureWorks2014" /> 
    </Connections> 
    <Databases> 
     <Database Name="AdventureWorks2014" ConnectionName="CMAdventureWorks2014" /> 
    </Databases> 
</Biml> 

Le second est tableImporter.biml

<Biml xmlns="http://schemas.varigence.com/biml.xsd"> 
    <# 
    var connection = RootNode.Connections["CMAdventureWorks2014"]; 
    List<string> schemaList = new List<string>{"Person"}; 
    var results = connection.GetDatabaseSchema(schemaList, null, ImportOptions.None); 

    #> 
    <Tables> 
     <!-- Always exclude ModifiedDate from our column emission --> 
     <# foreach (var table in results.TableNodes){ #> 
     <Table Name="<#=table.Name#>" SchemaName="<#= table.Schema #>"> 
      <Columns> 
       <# 
       // Use whatever logic to build exclusion list 
       var excludeList = table.Columns.Where(s => s.Name == "ModifiedDate"); 
       var output = table.Columns.Except(excludeList); 
       #> 
       <#= output.GetBiml() #> 
      </Columns> 
     </Table> 
     <# } #> 
     <#= results.TableNodes.GetBiml() #> 
    </Tables> 
    <Schemas> 
     <#= results.SchemaNodes.GetBiml() #> 
    </Schemas> 
</Biml> 

vous pouvez maintenant inspecter les nœuds de table ne sont pas une référence à ModifiedDate. Comme cela dépend de tableImporter.biml, nous devons spécifier qu'il est dans un niveau supérieur à Environment.biml (qui est le niveau 0 car il est biml statique) et tableImporter.biml (qui est le niveau 1 car il a script biml et non niveau explicite défini)

<#@ template tier="10" #> 
<Biml xmlns="http://schemas.varigence.com/biml.xsd"> 
    <Annotations> 
    <# foreach (var table in RootNode.Tables) {#> 
     <Annotation AnnotationType="Documentation" Tag="<#= table.ScopedName #>"><#= table.GetDropAndCreateDdl() #></Annotation> 
    <# } #> 
    </Annotations> 
</Biml> 
+0

Merci pour vos suggestions. Après quelques essais et erreurs, j'ai réussi à obtenir le résultat que j'avais après avoir utilisé la méthode RemoveFromParent. Le fichier biml suivant supprimera le SpatialLocation de la table Address: <# @ template language = "C#" niveau = "4" #> <# chaîne [,] table = { {"Address", "SpatialLocation"} }; pour (int i = 0; i Xanthos