A maneira como fiz isso no passado é com um pacote de loop infinito chamado do SQL Server Agent, por exemplo;
Este é o meu pacote de loop infinito:
Conjunto de 3 variáveis:
IsFileExists - Boolean - 0
FolderLocation - String - C:\Onde o arquivo deve ser colocado\
IsFileExists Boolean - 0
Para o contêiner For Loop:
Defina o
IsFileExists
variáveis como acima. Configure uma tarefa de script C# com ReadOnlyVariable como
User::FolderLocation
e tem o seguinte: 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;
}
}
}
O que isso fará é essencialmente ficar de olho no local da pasta para um arquivo .txt, se o arquivo não estiver lá, ele ficará suspenso por 10 segundos (você pode aumentar isso se quiser). Se o arquivo existir, ele será concluído e o pacote executará o pacote de carregamento. No entanto, ele continuará a ser executado, portanto, da próxima vez que um arquivo for inserido, ele executará o pacote de carregamento novamente.
Certifique-se de executar este pacote de loop para sempre como um trabalho de agente do servidor sql para que ele seja executado o tempo todo, temos um pacote semelhante em execução e nunca causou nenhum problema.
Além disso, certifique-se de que seu pacote de entrada mova/arquive o arquivo para fora do local da pasta de destino.