さまざまなファイルをそれぞれのテーブルに解析するいくつかの SSIS パッケージがあります。SSIS File Watcher タスクを使用して、ファイルのフォルダーをチェックし、優先順位の制約を使用して OutputVariableName に基づいて適切なサブ パッケージを選択するマスター パッケージを作成したいと考えています。変数を正しく設定するための式の書き方がわかりません。ファイル名の FINDSTRING() に基づいて設定したい。
1 に答える
あなたの質問は、KonesansのFile Watcher Taskを統合サービス パッケージで使用する方法に関するものです。
OutputVariableName 文字列タスクの完了時に見つかった完全なファイル パスが書き込まれる変数の名前。指定された変数は文字列型である必要があります
http://www.sqlis.com/post/file-watcher-task.aspx経由
CurrentFileName というパッケージ レベルで SSIS 変数を作成します。File Watcher Task
プロパティ OutputVariableName が になるように を構成しますUser::CurrentFileName
。タスクが監視しているフォルダーにファイルをドロップすると、その変数に完全なパスが割り当てられますCurrentFileName
。
起動するパッケージを決定するために、 FindString関数を使用してその変数を処理する必要があります。何かを指定していないので、ファイル名に基づいていると想定します。
このタスクを実行するために FindString を使用することを強制しているのは残念です。私がそう言うのは、.NET ライブラリがベース ファイル名を決定するための優れた静的方法を提供しているためです。
この取り組みをサポートするために、3 つの変数を作成します。
- BaseFileName - 文字列 - Expression = True として評価
- FileExtensionPosition - Int32 - Expression = True として評価
- LastSlashPosition - Int32 - Expression = True として評価
はLastSlashPosition
FindString を使用\
して、文字列内で最後に出現する を判別します。は、文字列内でFileExtensionPosition
最後に出現する を決定し.
ます。BaseFileName はこれらの数値を使用して、@[User::CurrentFileName]` 文字列をスライスする場所を計算します。
文字列の最後の X を見つけるために私が使用する怠惰なトリックは、それを逆にすることです。これは文字列の最初の要素であり、FindString の最後のパラメーターとして 1 を渡すことができます。
@[User::LastSlashPosition] に割り当てられた式は
FINDSTRING(REVERSE(@[User::CurrentFileName]), "\\", 1)
@[User::FileExtensionPosition] に割り当てられた式は
FINDSTRING(REVERSE(@[User::CurrentFileName]), ".", 1)
@[User::BaseFileName] に割り当てられた式は、次のようになります。
SUBSTRING((RIGHT(@[User::CurrentFileName], @[User::LastSlashPosition] -1 )), 1, LEN(RIGHT( @[User::CurrentFileName], @[User::LastSlashPosition] -1)) - @[User::FileExtensionPosition] )
それを分解(RIGHT(@[User::CurrentFileName], @[User::LastSlashPosition] -1 ))
すると、ベースファイル名に変換されます。CurrentFileName が J:\ssisdata\so\FileWatcher\CleverFile.txt に等しい場合、それは "CleverFile.txt" と評価され、末尾を取り除くために部分文字列を作成します。これを 1 つの部分文字列操作に減らすことはできますが、私の脳は遅くまで痛みます。
ここで、成功の優先順位制約に基づいて一連のパッケージ実行タスクを使用しようとしていると思います。これを実行すると、@[User::BaseFilename] == "SubPackage1
正常に動作します。ただ、それぞれを設定する必要があるだけです。新しい子をセットアップするために移動すると、作業を繰り返す必要があります。
このアプローチの代わりに、ForEach 列挙子を使用して、そこにすべてのキーと値のペアを定義します。
列 0 は、BaseFileName が評価できる値です。
列 1 は、応答として起動したい SSIS パッケージです。
これをサポートするために 2 つの変数を作成し、そのように構成しました
結果のパッケージは次のようになります
自分のマシンにインストールしたくないので、File Watcher Task は表示されていません。が ForEach ループに接続しているとします。
ForEach ループは、上記のキーと値のペアを処理します。コンテナー内のスクリプト タスクは、優先順位制約が機能するためのベースを提供するためだけに存在します。優先順位の制約を成功として構成し、@[User::KeyName] == @[User::BaseFileName]
次に、それに基づいてパッケージ実行タスクの起動をシミュレートします。実際のパッケージ名は、@[User::KeyPackage] の値によって決まります。
そして、それはその日の過度に設計されたソリューションです;)