Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SSIS条件拆分多个真实路径_Sql Server_Ssis - Fatal编程技术网

Sql server SSIS条件拆分多个真实路径

Sql server SSIS条件拆分多个真实路径,sql-server,ssis,Sql Server,Ssis,我在dtsx包中有一个数据流,它处理我需要处理的所有数据。最后,我需要执行一些清理任务。例如,假设以下结构: 如果一条记录在所有3种情况下都为true,那么我希望运行所有三个OLE DB命令。如果该记录仅适用于案例1,则它应仅运行案例1 我可以通过一个多播和3个独立的条件拆分(如下所示)来实现这一点,但我希望有一个更干净的方法。有什么想法吗 根据您对C#或VB的熟悉程度,您可以编写自己的转换,它本质上是一种多播和条件拆分。将脚本组件添加到数据流中,它将询问您它是源、转换还是目标。选择转换,添加

我在dtsx包中有一个数据流,它处理我需要处理的所有数据。最后,我需要执行一些清理任务。例如,假设以下结构:

如果一条记录在所有3种情况下都为true,那么我希望运行所有三个OLE DB命令。如果该记录仅适用于案例1,则它应仅运行案例1

我可以通过一个多播和3个独立的条件拆分(如下所示)来实现这一点,但我希望有一个更干净的方法。有什么想法吗


根据您对C#或VB的熟悉程度,您可以编写自己的转换,它本质上是一种多播和条件拆分。将脚本组件添加到数据流中,它将询问您它是源、转换还是目标。选择转换,添加您的输入和三个输出,然后从那里开始。祝你好运

使用一个多播和三个条件拆分是最容易实现的,也可能是最容易理解的

设置为具有三个输出的转换的脚本组件可能是下一个最容易实现的组件,但它将涉及一系列设置和某种级别的编码。数据流看起来相对漂亮:

对于每个输出,确保将
同步输入ID
设置为
None
(以便您可以控制何时创建行);然后需要在每个输出中复制每个输入列。脚本代码本身如下所示:

public override void IncomingRows\u ProcessInputRow(IncomingRowsBuffer Row)
{
if(案例1逻辑(世界其他地区))
{
Case1OutputBuffer.AddRow();
Case1OutputBuffer.ProductId=行.ProductId;
Case1OutputBuffer.Name=行.Name;
//等等,用于所有列
}
if(案例2逻辑(世界其他地区))
{
Case2OutputBuffer.AddRow();
Case2OutputBuffer.ProductId=行.ProductId;
Case2OutputBuffer.Name=行.Name;
//等等,用于所有列
}
if(案例3逻辑(世界其他地区))
{
Case3OutputBuffer.AddRow();
Case3OutputBuffer.ProductId=行.ProductId;
Case3OutputBuffer.Name=行.Name;
//等等,用于所有列
}
}
私人布尔案例1逻辑(IncomingRowsBuffer Row)
{
//无论案例1逻辑涉及到什么
}
私人布尔案例2逻辑(IncomingRowsBuffer Row)
{
//无论案例2的逻辑涉及到什么
}
专用布尔案例3逻辑(IncomingRowsBuffer Row)
{
//无论案例3逻辑涉及到什么
} 
当人们决定要更改列时,请享受保持此更新的乐趣

如果这还不够复杂,您可以编写自己的自定义转换。关于如何做到这一点的血淋淋的细节正在讨论中;只需说将会有更多的代码参与。对于SSIS如何处理缓冲区管理,您还将了解到比您想了解的更多的信息,这可能反过来解释了为什么开箱即用的条件拆分不允许您将同一行发送到多个输出

最后,如果您想要一个真正难看的解决方案,它也将成为维护的噩梦,请尝试为每种情况组合构建一个带有一个输出的条件拆分。在每个OLE目标前面放置一个Union All转换。将
案例1、2和3
输出定向到三向多播,其中一个多播输出分别指向三个Union All转换。条件拆分的
案例1和案例2
案例2和案例3
以及
案例1和案例3
输出将分别进行双向多播转换(这将反过来为适当的Union All提供数据),而
案例1
case2
case3
输出将直接发送到相应的Union All。它看起来像这样:


总之,我认为你最初的想法是最简单的,也可能是最好的。

我想那会管用的。看起来只是为了保持整洁而付出了一点努力。我希望有什么内置的…哇。谢谢你的努力和细节。我想我会坚持我的原创。我认为这是最好的选择,除非你真的想进入到本质编程。(有时,我们中的一些人真的很喜欢这样做…)很高兴能帮上忙!