【问题标题】:How to execute SSIS package when a file is arrived at folder文件到达文件夹时如何执行SSIS包
【发布时间】:2014-02-21 13:38:51
【问题描述】:

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

不确定文件到达时间,文件也可以多次到达。当文件到达时,这必须加载到表中。我认为,像文件观察任务这样的解决方案,仍然希望启动包

【问题讨论】:

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


【解决方案1】:

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

这是我的无限循环包:

设置 3 个变量:

IsFileExists - 布尔值 - 0

FolderLocation - String - C:\文件存放位置\

IsFileExists 布尔值 - 0

对于 For 循环容器:

如上设置IsFileExists变量。

将 ReadOnlyVariable 设置为 User::FolderLocation 的 C# 脚本任务,并具有以下内容:

 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 代理作业运行,以便它始终运行,我们有一个类似的包在运行,它从未引起任何问题。

另外,请确保您的输入包将文件从放置文件夹位置移开/存档。

【讨论】:

  • 感谢您的解决方案。问题是我们有 sql 2000 作为目标数据库(dwh)。并且在本地机器上安装了 ssis 2008。是否可以安排 sql 代理运行包?
  • 我想你可以在本地机器上运行带有 DTEXEC 的包,使用 Windows 任务计划设置它以在计算机重新启动时运行,如果它已经运行,只需观察停止任务的选项一定时期。虽然您需要安装集成服务。除此之外我不太确定。
  • @Peter_R“设置 3 个变量”?但是这些变量又被称为“IsFileExists”、“FolderLocation”和“IsFileExists”?
【解决方案2】:

正如其他人已经建议的那样,使用 WMI 任务或无限循环是实现此目的的两种选择,但 IMO SSIS 是资源密集型的。如果您让一个包在后台持续运行,它可能会占用大量内存、cpu 并导致其他包的性能问题,具体取决于您正在运行的其他包的数量。因此,您可能要考虑的其他选项是每 5 分钟或 10 分钟或其他时间安排一次代理作业,并在作业中调用您的包。将包配置为仅在文件存在时继续,否则退出。

【讨论】:

  • 问题是我们有 sql 2000 作为目标数据库(dwh)。在本地机器上安装了 ssis 2008。是否可以安排 sql 代理运行包?
  • 我不知道运行 2008 包的 SQL 2000 作业。
  • 您可以在安装了 SSIS 运行时的任何位置(即在您的 SQL 2008 安装上)运行 pacakge。您需要明确文件在哪里,以及需要在哪里运行包。
【解决方案3】:

您可以创建一个使用 WMI 检测文件到达和启动包的 Windows 服务。详情请看这里:http://msbimentalist.wordpress.com/2012/04/27/trigger-ssis-package-when-files-available-in-a-folder-part2/?relatedposts_exclude=330

【讨论】:

  • 看来我需要一些 .net 知识才能做到这一点。ssis 有什么方法可以实现这一点吗?
  • @user1254579 您可以使用查找文件的脚本任务运行永久循环包,然后执行另一个包。你的文件总是被称为同一个东西吗?即 customer.txt 或者它将是 customer1.txt 然后是 customer2.txt
  • 初始谷歌搜索显示您可以使用 FileWatcher 任务,但内存泄漏警告会导致我偏离该任务。看起来他准确地展示了你需要做的事情。
【解决方案4】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多