来自文件夹的SSIS进程文件

时间:2010-03-19 16:30:14

标签: file ssis

背景:

我有一个文件夹可以连续提取文件。我的SSIS包需要处理文件并删除它们。 SSIS包计划每分钟运行一次。我按文件创建时间的升序提取文件。我正在构建一个文件数组,然后处理 - 一次删除一个文件。

问题:

如果我的包的实例运行时间超过一分钟,则SSIS包的下一个实例将获取前一个实例在其缓冲区中的一些文件。当teh包的第二个实例处理文件时,它可能已被第一个实例删除,从而创建了一个异常条件。

我想知道是否有办法避免异常情况。

感谢。

5 个答案:

答案 0 :(得分:1)

在删除文件之前,您是否可以检查文件是否存在。

File.Exists(文件路径名)

答案 1 :(得分:1)

你是如何安排工作的?如果您使用的是SQL Server作业计划程序,那么我认为不应该重新运行已经运行的作业;看到这个问题:Will a SQL Server Job skip a scheduled run if it is already running?

或者,不是试图移动文件,而是可以构建一个工作步骤来测试它是否已经在运行。我自己没有这样做,但似乎有可能,请阅读这篇文章Detecting The State of a SQL Server Agent Job

答案 2 :(得分:0)

要确保您的软件包没有弄乱相同的文件,您可以创建一个名为文件名的空文件,但使用另一个扩展名(如mydata.csv.being_processes),并确保您的数据流任务正在运行仅适用于没有此类文件的文件。

这可以作为锁。

当然,你可以改变你安排工作的方式,但经常 - 当我们遇到这样的问题时 - 这是因为我们没有利用这些东西:)

答案 3 :(得分:0)

您可以创建“锁定文件”以防止并行执行包。为了保护自己免受崩溃包的影响,请考虑使用文件的创建日期来模拟锁定超时。

即:在包装开始时,您将检查是否存在锁定文件。如果它不存在或者它是在X小时前创建的 - 那么继续导入。否则退出。

答案 4 :(得分:0)

我有类似的情况。你所做的是让你的SSIS包读取文件夹中的所有文件,并创建一个工作文件,如'process.txt'。这将在该时间点创建有效文件列表。如果您有多个包,则使用名称“process_.txt”创建文件。该包只会处理其进程文件中指定的文件。这样可以防止重叠。