私が過去にこれを行った方法は、たとえばSQLServerAgentから呼び出された無限ループパッケージを使用することです。
これは私の無限ループパッケージです:
3つの変数を設定する:
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サーバーエージェントジョブとして実行して、常に実行されるようにしてください。同様のパッケージが実行されており、問題が発生することはありません。
また、入力パッケージがファイルをドロップフォルダの場所から移動/アーカイブすることを確認してください。