文件到达文件夹时如何执行SSIS包

时间:2014-01-29 16:07:21

标签: sql-server wmi sql-server-2000 ssis

要求是执行SSIS包,当文件到达文件夹时,我不想手动启动包。

它不确定文件到达时间,文件也可以多次到达。当文件到达时,这必须加载到一个表中。我认为,一些解决方案如文件观察器任务,仍然期望启动包

4 个答案:

答案 0 :(得分:9)

我过去这样做的方式是使用从SQL Server Agent调用的无限循环包,例如;

这是我的无限循环包:

Simple Package

设置3个变量:

IsFileExists - 布尔值 - 0

FolderLocation - String - C:\将文件放在\

IsFileExists布尔值 - 0

对于For循环容器:

For Loop Container

如上所述设置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)