要件は、SSISパッケージを実行することです。ファイルがフォルダーに到着したときに、パッケージを手動で開始したくありません。
ファイルの到着タイミングがわからない、またファイルが複数回到着する可能性があります。ファイルが到着するたびに、これをテーブルにロードする必要があります。ファイルウォッチャータスクなどのソリューションは、まだパッケージを開始することを期待しています。
私が過去にこれを行った方法は、たとえば、SQLServerエージェントから呼び出された無限ループパッケージを使用することです。
これは私の無限ループパッケージです:
つの変数を設定:
IsFileExists-ブール値-0
FolderLocation-文字列-C:\ファイルが配置される場所\
IsFileExistsブール値-0
Forループコンテナーの場合:
上記のようにIsFileExists
変数を設定します。
ReadOnlyVariableをUser::FolderLocation
としてC#スクリプトタスクを設定し、次のようにします。
public void Main()
{
int fileCount = 0;
string[] FilesToProcess;
while (fileCount == 0)
{
try
{
System.Threading.Thread.Sleep(10000);
FilesToProcess = System.IO.Directory.GetFiles(Dts.Variables["FolderLocation"].Value.ToString(), "*.txt");
fileCount = FilesToProcess.Length;
if (fileCount != 0)
{
for (int i = 0; i < fileCount; i++)
{
try
{
System.IO.FileStream fs = new System.IO.FileStream(FilesToProcess[i], System.IO.FileMode.Open);
fs.Close();
}
catch (System.IO.IOException ex)
{
fileCount = 0;
continue;
}
}
}
}
catch (Exception ex)
{
throw ex;
}
}
// TODO: Add your code here
Dts.TaskResult = (int)ScriptResults.Success;
}
}
}
これにより、基本的に.txtファイルのフォルダーの場所を監視します。ファイルがない場合は、10秒間スリープします(必要に応じてこれを増やすことができます)。ファイルが存在する場合、ファイルは完了し、パッケージはロードパッケージを実行します。ただし、実行は継続されるため、次にファイルがドロップされたときに、ロードパッケージが再度実行されます。
この永久ループパッケージをSQLサーバーエージェントジョブとして実行して、常に実行されるようにしてください。同様のパッケージが実行されており、問題が発生することはありません。
また、入力パッケージがファイルをドロップフォルダーの場所から移動/アーカイブすることを確認してください。
他の人がすでに示唆しているように、WMIタスクまたは無限ループのいずれかを使用することはこれを達成するための2つのオプションですが、IMOSSISはリソースを大量に消費します。パッケージを常にバックグラウンドで実行させると、could大量のメモリ、CPUを消費し、実行している他のパッケージの数によっては、他のパッケージでパフォーマンスの問題が発生します。したがって、検討したい他のオプションは、5分または10分などごとにエージェントジョブをスケジュールし、ジョブ内のパッケージを呼び出すことです。ファイルが存在する場合にのみ続行するようにパッケージを構成するか、そうでない場合は終了します。
SSISファイルウォッチャータスク はどうですか?
WMIを使用してファイルの到着を検出し、パッケージを起動するWindowsサービスを作成できます。方法の詳細はこちら: http://msbimentalist.wordpress.com/2012/04/27/trigger-ssis-package-when-files-available-in-a-folder-part2/?relatedposts_exclude = 3