Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.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
Ssis SSI在不使用SQL的情况下将多行合并并连接成单行_Ssis_Visual Studio 2017_Integration_Sql Server Data Tools_Kingswaysoft - Fatal编程技术网

Ssis SSI在不使用SQL的情况下将多行合并并连接成单行

Ssis SSI在不使用SQL的情况下将多行合并并连接成单行,ssis,visual-studio-2017,integration,sql-server-data-tools,kingswaysoft,Ssis,Visual Studio 2017,Integration,Sql Server Data Tools,Kingswaysoft,我正试图完成一些在SQL中非常容易完成的事情,但在SSIS中不使用SQL似乎非常具有挑战性。基本上,我需要合并和连接多对一关系的字段 给定实体:[合同项](多个)到(一个)[账户] 有一个字段[ari_productsummary]包含合同项实体上列出的产品。我们希望将该值作为[ari\u activecontractiontems]写入帐户。但是,帐户可能有多个与之关联的合同项记录,在这种情况下,我们希望将这些值串联起来。我们还只希望连接不同的值(在我的数据流中已经解决了不同的行) 这可以通过

我正试图完成一些在SQL中非常容易完成的事情,但在SSIS中不使用SQL似乎非常具有挑战性。基本上,我需要合并和连接多对一关系的字段

给定实体:[合同项](多个)到(一个)[账户]

有一个字段[ari_productsummary]包含合同项实体上列出的产品。我们希望将该值作为[ari\u activecontractiontems]写入帐户。但是,帐户可能有多个与之关联的合同项记录,在这种情况下,我们希望将这些值串联起来。我们还只希望连接不同的值(在我的数据流中已经解决了不同的行)

这可以通过写入一个临时表来完成,然后使用查询或视图获得如下汇总结果。我创建了一个名为TESTTABLE的SQL表,其中包含来自合同项的[ari_productsummary]实体以及引用的[accountid]以将其映射回帐户。然后,我编写了以下查询作为视图:

SELECT distinct accountid,
        (SELECT TT2.ari_productsummary + '; ' 
                FROM TESTTABLE TT2
                WHERE TT2.accountid = TT.accountid
                FOR XML PATH ('')
            ) AS 'ari_activecontractitems'
FROM TESTTABLE TT
执行该查询将为我提供所需的结果,然后我可以使用这些结果导入帐户实体,如下所示:

但如何在SSIS数据流中执行此操作,而不将数据作为临时占位符写入SQL表???我希望在一个数据流容器中执行整个过程,而不使用临时SQL表/视图。整个总结过程需要即时完成:

是否有人有一个不需要临时SQL表/视图/查询,但完全包含在数据流中的解决方案


我正在使用VS 2017和KingswaySoft Dynamic CRM 365 ETL工具集来开发我的解决方案/软件包。

我没有Dynamics,也没有自定义组件,因此我在这里创建了Spit balling

数据流1-契约聚合 此数据流的目的是在您提供的优雅查询中复制您的逻辑,并将其推送到一个数据库中(请参见末尾的2008+注释)

金山动力学源->脚本任务->缓存转换

如果要将排序保留在那里,请在执行脚本任务之前执行此操作。我将在脚本任务中采用的实现是,它是完全阻塞的——这就是所有行必须到达才能发送任何数据。像合并联接这样的任务只是部分阻塞,因为对排序数据的要求意味着,一旦您不再有当前项的匹配项,就可以将其发送到管道中

脚本任务即将完成。您将有两个输出列,您的key
accountid
和新的派生列
ari\u activecontractems
。该列可能需要很大—您最了解您的数据,但如果它是Dynamics中的blob类型(>4k unicode或>8k ascii字符),则必须将数据类型定义为DT_TEXT/DT_NTEXT

作为输入,您将从源代码中选择accountid和ari_productsummary

代码应该很简单。我们要查字典

    //  member variable
    Dictionary<string, List<string>> accumulator;

我们有一个即将发布的版本,它附带了一个组件,可以完全实现您想要实现的功能,而无需编写自定义代码。该功能目前正在预览中,请联系我们以获取该功能的私人访问权限。您可以在上找到我们的联系信息


更新-2020年6月5日,由于2020年发布的Wave 1,我们已在上向公众提供了组件。我们有两个组件可用于此目的。合成组件将获取输入值并在SSIS列中转换为复合值。分解组件的作用正好相反,它将获取一个输入值,并使用基于分隔符的文本拆分或XML/JSON数组拆分将其拆分为多行。

我脑子里没有本机组件。我假设您不只是在执行SQL任务中直接更新帐户的原因(完全跳过临时表和数据流任务是因为它是动态的,那里的一切都很困难?@billinkc正确,不能在执行SQL任务中更新帐户,必须使用Kingswavesoft工具在数据流任务中读/写动态。我并不介意我最初的解决方案,因为我认为它工作得很好,但我的老板更希望我取消以后可能出现故障的任何步骤,并认为SQL server是一个潜在的故障点,希望我探索所有选项。
    // initialize in PreProcess method
    accumulator = new Dictionary<string, List<string>>();
    // simulate the inbound queue
    // row_id would be something like Rows.row_id
    if (!accumulator.ContainsKey(row_id))
    {
        // Create an empty dictionary for our list
        accumulator.Add(row_id, new List<string>());
    }

    // add it if we don't have it
    if (!accumulator[row_id].Contains(invoice))
    {
        accumulator[row_id].Add(invoice);
    }
    // This is how we shove data out the pipe
    foreach(var kvp in accumulator)
    {
        // approximately thus
        OutputBuffer1.AddRow();
        OutputBuffer1.row_id = kvp.Key;
        OutputBuffer1.ari_productsummary = string.Join("; ",  kvp.Value);

    }