我正在使用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转换的示例或文档的高低,但没有用。有人能指出我正确的方向吗?
答案 0 :(得分: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。
答案 1 :(得分:0)
作为初步答案,请尝试添加
// Not sure how to handle multiple key columns
mrg.NumKeyColumns = 1;
mrg.LinkAllInputsToOutputs();
我的数据流设置为Current
分支看起来像
Historical
分支看起来像
我只在初始列上排序,因为我希望看到像source_id,col1,col2这样的输出。
我仍在查看代码,看看如何在那里添加连接键但尚未找到它。
答案 2 :(得分:0)
我现在想出了一个非最佳但实用的解决方案。如果您在其中一个查询中选择了两次连接键列,但只在其中一个上设置了排序选项,则它将链接到合并连接的输出。
答案 3 :(得分: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");