1

私は次のように見えるパッケージを持っています:

SSIS

赤い長方形でマークした2つの領域に注意してください。これらはすべての点で同一です。この重複を避けるためにパッケージに変更を加えることはできますか?ループとファイルシステムタスクが存在しないため、データフロータスクに移動できないようです。

4

3 に答える 3

0

「バッチログインの選択」タスクからレコードセットに両方のクエリを配置し、そのレコードセットに対して別のforeachループを作成して、変数からこれら2つのクエリを実行するだけです。2番目のforeachループにはいくつかの追加タスクがあることがわかります。そのため、それらを何らかの方法で「すべてのバッチログインを選択」タスクに組み込むか、両方のループで一致する制約を作成します。

于 2013-03-11T15:38:41.480 に答える
0

別のアプローチは、「バッチ」テーブルに「アクション」列を追加することです。(またはアウトリガーテーブルを追加します)。レコードに対して何をしたいのかを事前に理解してください。次に、レコードとファイルを1回削除します。

ここでRBAR操作を行っているようです。

したがって、たとえば、テーブルに対していくつかのUPDATEステートメントを実行すると、各レコードに削除のフラグが立てられているかどうかにかかわらず、テーブルが状態のままになります。

その後、ループを通過し、テーブルの内容に基づいて削除します。

それはあなたのパッケージをずっと簡単にするでしょう。また、レコードとファイルが常に同時に削除されるようにする「コミット」ロジックを組み込むことができます。

于 2013-03-11T22:52:56.677 に答える
0

@Billが述べたように、ループロジックのサブパッケージを作成できます。「クエリの結果セットを別のパッケージに渡す」方法は次のとおりです(例としてSSIS 2012を使用し、SSIS2005と同様の作業を行いました。したがって、c#コードをvb.netに変更するだけで済みます)

  1. 親パッケージで、親パッケージのresultSet変数 の名前を保持する変数を作成します。ここに画像の説明を入力してください

  2. サブパッケージで、文字列変数parentResultSetNameを作成します。 ここに画像の説明を入力してください

  3. サブパッケージで、パッケージ構成を追加して、parentResultSetNameを親パッケージ変数resultSetVariableNameにマッピングします。 ここに画像の説明を入力してください

  4. これで、サブパッケージのスクリプトタスクの名前でresultSet変数を読み取ることができます。

    public void Main()
    {
        // TODO: Add your code here
    
        var dsName = Dts.Variables["parentResultSetName"].Value.ToString();
        Variables variables = null;
    
        DataSet resultSet = null;
    
        Dts.VariableDispenser.LockForRead(dsName);
        Dts.VariableDispenser.GetVariables(ref variables);
    
        try
        {
            resultSet = variables[dsName].Value as DataSet;
    
            if (resultSet != null)
            {
                MessageBox.Show("Sub package get: " + resultSet.Tables[0].Rows[0][0].ToString());
            }
    
            Dts.TaskResult = (int)ScriptResults.Success;
        }
        catch (Exception e)
        {
            Dts.Events.FireError(-1, "", e.Message, "", 0);
        }
    }
    
  5. 結果は次のとおりです。 ここに画像の説明を入力してください

于 2013-03-14T10:05:32.750 に答える