Sposób, w jaki robiłem to w przeszłości, to pakiet nieskończonej pętli wywoływany na przykład z agenta SQL Server;
To jest mój pakiet nieskończonej pętli:
Ustaw 3 zmienne:
IsFileExists — Boolean — 0
FolderLocation - String - C:\Gdzie plik ma być umieszczony\
IsFileExists Boolean — 0
Dla kontenera For Loop:
Ustaw IsFileExists
zmienne jak wyżej.
Skonfiguruj zadanie skryptu C# z ReadOnlyVariable jako User::FolderLocation
i mieć następujące:
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;
}
}
}
Zasadniczo będzie to mieć oko na lokalizację folderu dla pliku .txt, jeśli pliku nie ma, będzie spał przez 10 sekund (możesz to zwiększyć, jeśli chcesz). Jeśli plik istnieje, zakończy się, a pakiet wykona pakiet ładowania. Jednak będzie nadal działać, więc następnym razem, gdy plik zostanie w nim upuszczony, ponownie uruchomi się pakiet ładujący.
Upewnij się, że uruchamiasz ten pakiet z pętlą wieczną jako zadanie agenta serwera sql, aby działał przez cały czas. Mamy uruchomiony podobny pakiet i nigdy nie spowodował on żadnych problemów.
Upewnij się również, że pakiet wejściowy przenosi/archiwizuje plik z dala od lokalizacji folderu upuszczania.