在我们的 Biml 文件中,我们rootnode
使用该GetDataSchema()
方法构建了一个数据模型。SSIS 包基于模型中的表和列。
我们希望能够在RootNode
编译包之前从 中删除一列。请让我知道如何做到这一点?能不能用这个RemoveRootNode(0
方法。如果是这样。如何?谢谢你。
如果您已经将表具体化到 Tables 集合中,则可以像 Cathrine 演示的那样排除该列。这种方法的优点是可以使用源表的完整架构,以防有人确实需要排除的列。当然,缺点是每个不需要它的人都必须重复你的排除逻辑。
另一种方法是在导入数据但在将其设为 Tables 集合之前处理它。凯瑟琳的同样把戏,只是在不同的地方
假设你有两个文件。第一个是 Environment.biml 看起来像
<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>
第二个是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>
现在您可以检查表节点没有对 ModifiedDate 的引用。由于这将取决于 tableImporter.biml,我们需要指定它比 Environment.biml(它是第 0 层,因为它是静态 biml)和 tableImporter.biml(它是第 1 层,因为它有 biml 脚本并且没有显式层定义)
<#@ 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>