1

我正在使用 EzAPI 库以编程方式构建一个相当复杂的 SSIS 数据流并且遇到了障碍。我附上了我正在努力实现的目标的图像。

在此处输入图像描述

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

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

            int sortPosition;

            var df = new EzDataFlow(p);

            var cur = new EzOleDbSource(df);
            cur.Connection = dstConn;
            cur.Table = "Table1";

            var hst = new EzOleDbSource(df);
            hst.Connection = hstConn;
            hst.Table = "Table2";

            // Add all the columns to the sort transformation for the Current database table
            var sortCurr = new EzSortTransform(df);
            sortCurr.AttachTo(cur);

            sortPosition = 1;
            foreach (Column c in table.Columns)
            {
                sortCurr.SortOrder[c.ColumnName] = sortPosition++;
            }


            // Same for history
            var sortHst = new EzSortTransform(df);
            sortHst.AttachTo(hst);

            sortPosition = 1;
            foreach (Column c in table.Columns)
            {
                sortHst.SortOrder[c.ColumnName] = sortPosition++;
            }

            var mrg = new EzMergeJoin(df);

            mrg.AttachTo(sortCurr, 0, 0);
            mrg.AttachTo(sortHst, 0, 1);

            mrg.JoinType = MergeJoinType.Full;

            ... now what?

我已经在高处和低处搜索了 EzMergeJoin 转换的示例或文档,但无济于事。谁能指出我正确的方向?

4

4 回答 4

1

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

这是我们的代码示例,一旦正确设置了输入列,就没什么特别的了:

            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 直接从Dimodelo Architect中捕获的数据仓库设计自动为数据仓库生成复杂的 ETL 。

于 2013-01-30T06:38:30.477 回答
0

作为最初的答案,尝试添加

        // Not sure how to handle multiple key columns
        mrg.NumKeyColumns = 1;
        mrg.LinkAllInputsToOutputs();

我的数据流设置为Current分支看起来像

  • source_id(已排序)
  • col1

Historical分支看起来像

  • source_id(已排序)
  • col2

我只对初始列进行排序,因为我希望看到像 source_id、col1、col2 这样的输出。

在此处输入图像描述

我仍在查看代码以查看如何在其中添加连接键,但尚未找到。

于 2012-02-01T19:11:27.150 回答
0

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

于 2012-08-02T16:09:53.587 回答
0

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

前:

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");
于 2016-06-15T22:26:24.420 回答