要求是执行SSIS包,当文件到达文件夹时,我不想手动启动包。
它不确定文件到达时间,文件也可以多次到达。当文件到达时,这必须加载到一个表中。我认为,一些解决方案如文件观察器任务,仍然期望启动包
答案 0 :(得分:9)
我过去这样做的方式是使用从SQL Server Agent调用的无限循环包,例如;
这是我的无限循环包:
设置3个变量:
IsFileExists - 布尔值 - 0
FolderLocation - String - C:\将文件放在\
中IsFileExists布尔值 - 0
对于For循环容器:
如上所述设置IsFileExists
变量。
设置一个C#脚本任务,其ReadOnlyVariable为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;
}
}
}
这样做基本上是关注.txt文件的文件夹位置,如果文件不存在,它将会睡眠10秒(如果需要,可以增加此值)。如果文件确实存在,它将完成,然后包将执行加载包。但是它会继续运行,所以下次放入文件时会再次执行加载包。
确保将此永久循环包作为sql server代理作业运行,以便它一直运行,我们有一个类似的包运行,它从未引起任何问题。
另外,请确保您的输入包将文件从drop文件夹位置移开/存档。
答案 1 :(得分:6)
正如其他人已经建议的那样,使用WMI任务或无限循环是实现此目的的两个选项,但IMO SSIS是资源密集型的。如果你让一个软件包不断在后台运行,可能会占用大量内存,cpu并导致其他软件包的性能问题,具体取决于你运行的其他软件包的数量。因此,您可能需要考虑的其他选项是每隔5分钟或10分钟安排一次代理作业,并在作业中调用您的包。将程序包配置为仅在文件存在时继续,否则退出。
答案 2 :(得分:2)
您可以创建一个使用WMI检测文件到达和启动包的Windows服务。有关如何位于此处的详细信息:http://msbimentalist.wordpress.com/2012/04/27/trigger-ssis-package-when-files-available-in-a-folder-part2/?relatedposts_exclude=330
答案 3 :(得分:2)