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

残念ながら、結合キーがデータ フローを通過しないという問題を修正する方法は見つかりませんでした。私たちが思いついた唯一の答えは、アップストリーム コンポーネントで異なる名前の結合キーを 2 回選択することです。次に、重複のみを並べ替えます。これにより、マージ結合で重複が結合キーとして使用されます。元の列は、データ フローの次のコンポーネントに渡されます。

入力列が正しく設定されていれば、特別なことは何もありません。

            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 は、Dimodelo Architect でキャプチャされたデータ ウェアハウス設計からの情報を含む XElement オブジェクトです。EzAPI を使用して、 Dimodelo Architectでキャプチャされたデータ ウェアハウスの設計から直接、データ ウェアハウスの複雑な ETL の生成を自動化します。

于 2013-01-30T06:38:30.477 に答える
0

私は今のところ、最適ではないが実用的な解決策を見つけました。クエリの1つで結合キー列を2回選択し、そのうちの1つにのみ並べ替えオプションを設定すると、マージ結合の出力にリンクされます。

于 2012-08-02T16:09:53.587 に答える
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

これは、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 に答える