これを実現する方法の 1 つを次に示します。Expression Task
と組み合わせて使用しForeach Loop Container
て、ファイル名の数値を一致させることができます。これを行う方法を示す例を次に示します。サンプルは を使用していSSIS 2012
ます。
これはあまり効率的ではないかもしれませんが、これを行う 1 つの方法です。
YYYYMMDD という形式で名前が付けられた多数のファイルを含むフォルダーがあるとします。フォルダーには、 19210101、19210201、19210301など、1921 年以降の毎月の最初の日のファイルが含まれています。それはファイルを追加し1,103
ます。
要件は、1948 年 6 月以降に作成されたファイルのみをループすることであるとしましょう。つまり、SSIS パッケージは より大きいファイルのみをループする必要があります19480601
。
SSIS パッケージで、次の 3 つのパラメーターを作成します。これらの値は環境全体で構成できるため、これらのパラメーターを構成することをお勧めします。
ExtensionToMatch
- データ型のこのパラメーターにはString
、パッケージがループする必要がある拡張子が含まれます。FileSpec
これにより、Foreach ループ コンテナーで使用される変数に値が追加されます。
FolderToEnumerate
- データ型のこのパラメーターはString
、ループするファイルを含むフォルダー パスを格納します。
MinIndexId
- データ型のこのパラメーターにはInt32
、ファイルがパターンに一致する最小数値が含まれます。
ファイルをループするのに役立つ次の 4 つのパラメーターを作成します。
ActiveFilePath
- このデータ型の変数はString
、Foreach ループ コンテナーがフォルダー内の各ファイルをループするときにファイル名を保持します。この変数は、別の変数の式で使用されます。エラーを回避するには、空でない値、たとえば 1 に設定します。
FileCount
Int32
- これは、Foreach ループ コンテナーがループするファイルの数を示すために、このサンプルで使用されるデータ型のダミー変数です。
FileSpec
- データ型のこの変数はString
、ループするファイル パターンを保持します。この変数の式を以下の値に設定します。この式は、パラメーターで指定された拡張子を使用します。拡張子がない場合は、*.*
すべてのファイルをループします。
"*" + (@[$Package::ExtensionToMatch] == "" ? ".*" : @[$Package::ExtensionToMatch])
ProcessThisFile
- データ型のこの変数はBoolean
、特定のファイルが条件に一致するかどうかを評価します。
以下に示すようにパッケージを構成します。Foreach ループ コンテナーは、FileSpec
変数で指定されたパターンに一致するすべてのファイルをループします。式タスクで指定された式は実行時に評価され、変数 ProcessThisFile に入力されます。この変数は、優先順位制約で使用され、ファイルを処理するかどうかを決定します。
Foreach ループ コンテナー内のスクリプト タスクはFileCount
、式に正常に一致するファイルごとに変数のカウンターを 1 ずつ増やします。
Foreach ループの外側のスクリプト タスクは、Foreach ループ コンテナーによってループされたファイルの数を表示するだけです。
パラメーターを使用してフォルダーをループし、変数を使用してファイルをループするように Foreach ループ コンテナーを構成します。
ActiveFilePath
ループが各ファイルを通過するときに、ファイル名を変数に格納します。
式タスクで、式を次の値に設定します。式は、拡張子のないファイル名を数値に変換し、パラメーターで指定された数値よりも大きいと評価されるかどうかを確認します。MinIndexId
@[User::ProcessThisFile] = (DT_BOOL)((DT_I4)(REPLACE(@[User::ActiveFilePath], @[User::FileSpec] ,"")) > @[$Package::MinIndexId] ? 1: 0)
Precedence 制約を右クリックしProcessThisFile
、式で変数を使用するように構成します。これにより、式タスクで設定された条件に一致する場合にのみファイルを処理するようパッケージに指示します。
@[ユーザー::ProcessThisFile]
最初のスクリプト タスクでは、変数をReadWriteVariablesUser::FileCount
に設定し、スクリプト タスク内に次の C# コードを記述します。これにより、条件に正常に一致したファイルのカウンターがインクリメントされます。
public void Main()
{
Dts.Variables["User::FileCount"].Value = Convert.ToInt32(Dts.Variables["User::FileCount"].Value) + 1;
Dts.TaskResult = (int)ScriptResults.Success;
}
2 番目のスクリプト タスクでは、変数をReadOnlyVariablesUser::FileCount
に設定し、スクリプト タスク内に次の C# コードを記述します。これは、処理されたファイルの総数を単純に出力します。
public void Main()
{
MessageBox.Show(String.Format("Total files looped through: {0}", Dts.Variables["User::FileCount"].Value));
Dts.TaskResult = (int)ScriptResults.Success;
}
MinIndexId を設定してパッケージを実行すると1948061
(これを除く)、 value が出力されます773
。
MinIndexId を設定してパッケージを実行すると20111201
(これを除く)、 value が出力されます11
。
それが役立つことを願っています。