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 如何使用EzAPI将MergeJoin转换中的输入列映射到输出列?_Ssis_Ezapi - Fatal编程技术网

Ssis 如何使用EzAPI将MergeJoin转换中的输入列映射到输出列?

Ssis 如何使用EzAPI将MergeJoin转换中的输入列映射到输出列?,ssis,ezapi,Ssis,Ezapi,我正在使用EzAPI库以编程方式构建一个相当复杂的SSIS数据流,遇到了一个障碍。我附上了一张我想要实现的目标的图片 我已经让开始(直到合并联接)正常工作,但是在尝试将合并联接组件的输入映射到输出时,我遇到了问题 以下是我到目前为止的代码(显然只是一个片段) 我到处寻找EzMergeJoin转换的示例或文档,但都没有结果。有人能给我指出正确的方向吗?作为初始答案,请尝试添加 // Not sure how to handle multiple key columns

我正在使用EzAPI库以编程方式构建一个相当复杂的SSIS数据流,遇到了一个障碍。我附上了一张我想要实现的目标的图片

我已经让开始(直到合并联接)正常工作,但是在尝试将合并联接组件的输入映射到输出时,我遇到了问题

以下是我到目前为止的代码(显然只是一个片段)


我到处寻找EzMergeJoin转换的示例或文档,但都没有结果。有人能给我指出正确的方向吗?

作为初始答案,请尝试添加

        // Not sure how to handle multiple key columns
        mrg.NumKeyColumns = 1;
        mrg.LinkAllInputsToOutputs();
我的数据流设置为当前分支

  • 源id(已排序)
  • 可乐
历史
分支看起来像

  • 源id(已排序)
  • 可乐
我只对初始列进行了排序,因为我希望看到像source_id、col1、col2这样的输出


我仍在查看代码,以了解如何在其中添加join键,但尚未找到它。

作为初始答案,请尝试添加

        // Not sure how to handle multiple key columns
        mrg.NumKeyColumns = 1;
        mrg.LinkAllInputsToOutputs();
我的数据流设置为当前分支

  • 源id(已排序)
  • 可乐
历史
分支看起来像

  • 源id(已排序)
  • 可乐
我只对初始列进行了排序,因为我希望看到像source_id、col1、col2这样的输出


我仍在查看代码,看看如何在其中添加join键,但还没有找到它。

我现在想出了一个非最佳但实用的解决方案。如果在一个查询中两次选择join key列,但只在其中一个查询上设置sort选项,它将链接到合并联接的输出。

我现在想出了一个非最佳但实用的解决方案。如果在一个查询中两次选择联接键列,但只在其中一个查询上设置了排序选项,它将链接到合并联接的输出。

不幸的是,我们还没有找到解决联接键未通过数据流传递的问题的方法。我们得到的唯一答案是在上游组件中选择两个具有不同名称的连接键。然后仅对重复项进行排序,这使得合并联接将重复项用作联接键。原始列然后传递到数据流中的下一个组件

这是我们的代码示例,只要输入列设置正确,就没有什么特别之处:

            MergeJoin = new EzMergeJoin(TransformTranFact);
            MergeJoin.Name = "Merge Join";
            MergeJoin.AttachTo(SourceChecksum, 0, 0);
            MergeJoin.AttachTo(FactTranFact, 0, 1);
            MergeJoin.LinkAllInputsToOutputs();
            MergeJoin.JoinType = MergeJoinType.Full;
            MergeJoin.NumKeyColumns = mchs.Count();

mchs是一个XElement对象,包含来自Dimodelo Architect中捕获的数据仓库设计的信息。我们使用EzAPI直接从中捕获的数据仓库设计自动生成数据仓库的复杂ETL

不幸的是,我们还没有找到一种方法来解决连接键未通过数据流的问题。我们得到的唯一答案是在上游组件中选择两个具有不同名称的连接键。然后仅对重复项进行排序,这使得合并联接将重复项用作联接键。原始列然后传递到数据流中的下一个组件

这是我们的代码示例,只要输入列设置正确,就没有什么特别之处:

            MergeJoin = new EzMergeJoin(TransformTranFact);
            MergeJoin.Name = "Merge Join";
            MergeJoin.AttachTo(SourceChecksum, 0, 0);
            MergeJoin.AttachTo(FactTranFact, 0, 1);
            MergeJoin.LinkAllInputsToOutputs();
            MergeJoin.JoinType = MergeJoinType.Full;
            MergeJoin.NumKeyColumns = mchs.Count();

mchs是一个XElement对象,包含来自Dimodelo Architect中捕获的数据仓库设计的信息。我们使用EzAPI直接从中捕获的数据仓库设计自动生成数据仓库的复杂ETL

我可以通过对EzComponent中的linkInputOutput方法进行一个小的修改来解决这个问题。以下是之前/之后的内容:

之前:

if (InputColumnExists(inputIndex, colName))
    return; // return as this column is already linked
IDTSInput100 input = m_meta.InputCollection[inputIndex];
IDTSVirtualInput100 virtualInput = input.GetVirtualInput();
IDTSVirtualInputColumn100 virtualInputColumn = virtualInput.VirtualInputColumnCollection[colName];
m_comp.SetUsageType(input.ID, virtualInput, virtualInputColumn.LineageID, DTSUsageType.UT_READONLY);
之后:

IDTSInput100 input = m_meta.InputCollection[inputIndex];
IDTSVirtualInput100 virtualInput = input.GetVirtualInput();
IDTSVirtualInputColumn100 virtualInputColumn = virtualInput.VirtualInputColumnCollection[colName];
if (InputColumnExists(inputIndex, colName))
    m_comp.SetUsageType(input.ID, virtualInput, virtualInputColumn.LineageID, DTSUsageType.UT_IGNORED);

m_comp.SetUsageType(input.ID, virtualInput, virtualInputColumn.LineageID, DTSUsageType.UT_READONLY);
您仍然需要手动链接两个源组件中存在的列,如下所示:

mergeJoin.LinkInputToOutput(0, "KeyField");

我可以通过对EzComponent中的linkInputOutput方法进行一个小的修改来解决这个问题。以下是之前/之后的内容:

之前:

if (InputColumnExists(inputIndex, colName))
    return; // return as this column is already linked
IDTSInput100 input = m_meta.InputCollection[inputIndex];
IDTSVirtualInput100 virtualInput = input.GetVirtualInput();
IDTSVirtualInputColumn100 virtualInputColumn = virtualInput.VirtualInputColumnCollection[colName];
m_comp.SetUsageType(input.ID, virtualInput, virtualInputColumn.LineageID, DTSUsageType.UT_READONLY);
之后:

IDTSInput100 input = m_meta.InputCollection[inputIndex];
IDTSVirtualInput100 virtualInput = input.GetVirtualInput();
IDTSVirtualInputColumn100 virtualInputColumn = virtualInput.VirtualInputColumnCollection[colName];
if (InputColumnExists(inputIndex, colName))
    m_comp.SetUsageType(input.ID, virtualInput, virtualInputColumn.LineageID, DTSUsageType.UT_IGNORED);

m_comp.SetUsageType(input.ID, virtualInput, virtualInputColumn.LineageID, DTSUsageType.UT_READONLY);
您仍然需要手动链接两个源组件中存在的列,如下所示:

mergeJoin.LinkInputToOutput(0, "KeyField");

运行现有代码的结果是什么?将合并联接添加到画布,两个输入都与之接触,但没有映射列?运行现有代码的结果是什么?在画布上添加了一个合并联接,两个输入都与之接触,但没有映射列?有趣的是,当我添加此联接时,我将两个表之间的所有列都联接起来(这很好),而底部的输出表中没有任何列—不太好。我想我将不得不在某个时候开始阅读EzAPI的源代码-这是一个非常有用的库,但文档非常糟糕。查看从BIDS生成的包,我就快到了,看起来我只需要在合并连接属性中勾选“选择所有映射”复选框。我也有同样的问题,你找到一种选择所有映射的方法了吗?有趣的是,当我添加这个时,我得到了两个表之间连接的所有列(这很好),而输出表底部没有任何列-不太好。我想我将不得不在某个时候开始阅读EzAPI的源代码-这是一个非常有用的库,但文档非常糟糕。查看从BIDS生成的包,我就快到了,看起来我只需要在合并连接属性中勾选“选择所有映射”复选框。我也有同样的问题,您是否找到了选择所有映射的方法?