use*_*579 9 sql-server wmi ssis sql-server-2000
要求是执行SSIS包,当文件到达文件夹时,我不想手动启动包.
它不确定文件的到达时间,文件也可以多次到达.当文件到达时,这必须加载到一个表中.我认为,一些解决方案如文件观察器任务,仍然期望启动包
小智 9
我过去这样做的方式是使用从SQL Server Agent调用的无限循环包,例如;
这是我的无限循环包:

设置3个变量:
IsFileExists - 布尔值 - 0
FolderLocation - String - C:\文件放在哪里\
IsFileExists布尔值 - 0
对于For循环容器:

IsFileExists如上设置变量.
使用ReadOnlyVariable设置C#脚本任务,User::FolderLocation并具有以下内容:
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这样做基本上是关注.txt文件的文件夹位置,如果文件不在那里,它会睡10秒钟(如果你愿意,你可以增加它).如果文件确实存在,它将完成,然后包将执行加载包.但是它会继续运行,所以下次删除文件时会再次执行加载包.
确保将此永久循环包作为sql server代理作业运行,这样它将一直运行,我们有一个类似的包正在运行,它从未引起任何问题.
此外,请确保您的输入包将文件移动/存档远离放置文件夹位置.
小智 6
正如其他人已经建议的那样,使用WMI任务或无限循环是实现这一目标的两个选择,但IMO SSIS是资源密集型的.如果你让一个软件包不断在后台运行,它可能会占用大量内存,cpu并导致其他软件包出现性能问题,具体取决于你运行的其他软件包的数量.因此,您可能需要考虑的其他选项是每隔5分钟或10分钟安排一次代理作业,并在作业中调用您的包.将程序包配置为仅在文件存在时继续,否则退出.