无法为SSIS中的分层生成BIML脚本

无法为SSIS中的分层生成BIML脚本,ssis,biml,Ssis,Biml,我的主biml生成150个执行包任务。我需要生成序列容器,以便每个容器在主包中的每个序列容器中都保存(150/10)15个执行包任务 你能帮我找到一个合适的解决方案吗欢迎任何想法/工作经验/代码库 <Tasks> <# foreach (var package in RootNode.Packages) { #> <ExecutePackage Name="Execute <#=package.Name#>" >

我的主biml生成150个执行包任务。我需要生成序列容器,以便每个容器在主包中的每个序列容器中都保存(150/10)15个执行包任务

你能帮我找到一个合适的解决方案吗欢迎任何想法/工作经验/代码库

<Tasks> 
    <# foreach (var package in RootNode.Packages) { #> 
         <ExecutePackage Name="Execute <#=package.Name#>" > 
              <ExternalProjectPackage Package="<#=package.PackageFileName#>" /> 
         </ExecutePackage>
    <# } #>
</Tasks> 

此答案将利用Biml的一些高级概念。第一个是分层,因此我们将在第1层生成150个包。然后在第2层(或任何大于前一层的数字),我们将能够将第0层的劳动成果引用到(第max-1层)

第0层是静态/平面Biml(本例中没有)。因为我们将循环生成子包,所以它将自动位于第1层,但我选择在这里明确表示,以防您需要解决前体但动态的任务

是一种功能强大的注释结构,Biml编译器会忽略它

是用于将显式方法和类添加到Biml中的构造

我们还将使用一个函数将我们的包大致分成若干组,然后放入序列容器中

一级 此代码生成名称范围从so_54773502_000到so_54773502_149(总共150个)的空白SSIS包

最终结果 瞧,妈,很多包都被执行了


主程序包是否需要查看可用的程序包,或者您是假设Package000->Package149?它们之间是否存在依赖顺序?彼此之间也没有依赖关系。所有这些都应该并行执行,但放在相同的容器中。@billinkc Yes主程序包查看以下代码@Sqldev_91您应该接受答案,而不是仅仅说谢谢。只需单击答案左侧投票箭头上方的已接受标记,但这超出了我的范围(令人印象深刻且可怕:)@Sqldev_91为什么不接受此解决方案,您必须选中投票箭头下方的标记以将此答案标记为已接受。有关更多信息,请查看
<#@ template tier="1" #>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Packages>
<#foreach (int index in Enumerable.Range(0, 150)){#>
    <Package Name="so_54773502_<#= string.Format("{0:000}", index) #>" />
<#}#>
    </Packages>
</Biml>
<#@ template tier="2" #>
<#
int taskCountPerContainer = 10;
int currentContainerNumber = 0;
#>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Packages>
        <Package Name="master">
            <Tasks>
<#* 
    This is such a fun bit of LINQ. I used the Split extension so handily defined on the linked question
    I pass in a List of package names and how many buckets I want and it returns a list of lists

    From there, we enumerate through the list bucket and for each element we find, we create a sequence
    container. Then, for each element in the bucket, we add an Execute Package Task.

    I was unable to Split an instance of AstPackageNodes as it resulted in the error below but the only reason
    your sample needed the full object was to provide both Name and PackageFileName properties. We can derive
    the second given the first

// foreach(var outerlist in Split(this.RootNode.Packages.ToList<AstPackageNode>(),taskCountPerContainer)){    
// results in this error. 
// Destination array was not long enough. Check destIndex and length, and the array's lower bounds.    
// TODO: Check with Varigence or run in C# project

*#>
                <#foreach(var listOfPackages in Split(this.RootNode.Packages.Select(x => x.Name).ToList<string>(), taskCountPerContainer)){#>
                <Container Name="SEQC_<#=currentContainerNumber++#>" ConstraintMode="Linear">
                    <Tasks>
                    <#foreach(var packageName in listOfPackages){#>
                        <ExecutePackage Name="EPT <#=packageName#>"><ExternalProjectPackage Package="<#=packageName#>.dtsx"/></ExecutePackage>
                    <#}#>
                    </Tasks>
                </Container>
                <#}#>
            </Tasks>
        </Package>
    </Packages>
</Biml>

<#+
// https://stackoverflow.com/questions/419019/split-list-into-sublists-with-linq
public static IList<List<T>> Split<T>(IList<T> source, int buckets)
{
    return  source
        .Select((x, i) => new { Index = i, Value = x })
        .GroupBy(x => x.Index / buckets)
        .Select(x => x.Select(v => v.Value).ToList())
        .ToList();
}

#>