私は次のように見えるパッケージを持っています:
赤い長方形でマークした2つの領域に注意してください。これらはすべての点で同一です。この重複を避けるためにパッケージに変更を加えることはできますか?ループとファイルシステムタスクが存在しないため、データフロータスクに移動できないようです。
私は次のように見えるパッケージを持っています:
赤い長方形でマークした2つの領域に注意してください。これらはすべての点で同一です。この重複を避けるためにパッケージに変更を加えることはできますか?ループとファイルシステムタスクが存在しないため、データフロータスクに移動できないようです。
「バッチログインの選択」タスクからレコードセットに両方のクエリを配置し、そのレコードセットに対して別のforeachループを作成して、変数からこれら2つのクエリを実行するだけです。2番目のforeachループにはいくつかの追加タスクがあることがわかります。そのため、それらを何らかの方法で「すべてのバッチログインを選択」タスクに組み込むか、両方のループで一致する制約を作成します。
別のアプローチは、「バッチ」テーブルに「アクション」列を追加することです。(またはアウトリガーテーブルを追加します)。レコードに対して何をしたいのかを事前に理解してください。次に、レコードとファイルを1回削除します。
ここでRBAR操作を行っているようです。
したがって、たとえば、テーブルに対していくつかのUPDATEステートメントを実行すると、各レコードに削除のフラグが立てられているかどうかにかかわらず、テーブルが状態のままになります。
その後、ループを通過し、テーブルの内容に基づいて削除します。
それはあなたのパッケージをずっと簡単にするでしょう。また、レコードとファイルが常に同時に削除されるようにする「コミット」ロジックを組み込むことができます。
@Billが述べたように、ループロジックのサブパッケージを作成できます。「クエリの結果セットを別のパッケージに渡す」方法は次のとおりです(例としてSSIS 2012を使用し、SSIS2005と同様の作業を行いました。したがって、c#コードをvb.netに変更するだけで済みます)
親パッケージで、親パッケージのresultSet変数 の名前を保持する変数を作成します。
サブパッケージで、文字列変数parentResultSetNameを作成します。
サブパッケージで、パッケージ構成を追加して、parentResultSetNameを親パッケージ変数resultSetVariableNameにマッピングします。
これで、サブパッケージのスクリプトタスクの名前で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);
}
}
結果は次のとおりです。