私の意見では、データを機能的に分割するのが最善の方法です。ほとんどの場合、これを行うには日付列が適切です。例として注文日を見てみましょう。
その列について、最適な分母を見つけます。たとえば、注文日の各年は約100万行を生成します。
for eachループコンテナの代わりに、forループコンテナを使用します。
このループを機能させるには、ソースデータですべての注文日の最小および最大年を見つける必要があります。これらは、スカラー結果をSSIS変数に保存するSQLステートメントを使用して取得できます。
次に、forループコンテナを設定して、以前に変数に格納した最小年と最大年の間でループし、反復ごとに1年を追加します。
最後に、実際にデータを取得するには、ソースSQLステートメントを、forループコンテナーによって生成された現在の年を指定するwhere句を含む変数の式として保存する必要があります。
"SELECT * FROM transactions WHERE YEAR(OrderDate) = " + @[User::ForLoopCurrentYear]
これで、データフローソースでこの変数を使用して、パーティション化されたデータを取得できます。
編集:
for eachループコンテナを使用する別の解決策は、SQL実行タスクでパーティションキーを取得し、その結果セットを次のタイプのSSIS変数に保存することですObject
。
SELECT YEAR(OrderDate) FROM transaction GROUP BY YEAR(OrderDate)
for eachループコンテナーを使用すると、ADO列挙子を使用してオブジェクトをループし、上記と同じ方法を使用して、現在の年をソースSQLステートメントに挿入できます。