gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:20:36 24 4
gpt4 key购买 nike

我遇到这样一种情况,我的主 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 层的劳动成果引用到(最大层 - 1).

第 0 层是静态/平坦的 Biml(在本例中我们没有)。由于我们将循环生成子包,因此它会自动位于第 1 层,但我选择在此处明确表示,以防您有先驱但动态的任务要解决

<#* .... #>是一个 super 强大的注释结构,被 Biml 编译器忽略

<#+ .... #>是用于将显式方法和类添加到您的 Biml 中的构造

我们还将使用 Extension method大致将我们的包分成几组,然后填充到序列容器中。

一级

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

<#@ 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>

第 2 层

在这里我们指定我们想要多少个并行容器。 Split的结果方法是列表的列表。对于外部容器列表中的每个元素,我们需要添加一个序列容器。对于弹出列表中的每个元素,我们需要对其进行枚举并执行打包任务。

<#@ 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();
}

#>

最终结果

你看,很多包都被执行了!

enter image description here

关于ssis - 无法为 SSIS 中的分层生成 BIML 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54773502/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com