2013-03-20 29 views
2

我开发了一个消耗平面文件的ETL。平面文件的大小从250 MB到300 MB不等。 当文件存在于文件夹中时,它工作得很好。但是当文件处于生成模式时它会失败。例如:只有当完整文件存在于文件夹中时才运行SSIS

例如:此ETL包从早上8点运行到上午10点,以检查文件是否存在于文件夹中。现在,在任何情况下(比如说上午9点),如果文件正在开始生成,直到现在它是10 MB。 ETL开始处理文件,并在4-5分钟后挂起并失败(挂在正在读取该文件存在于文件夹中的脚本任务中)。

仅当文件生成完成后才触发SSIS包的最佳方法是什么?

注意:我无法控制文件生成。

+0

您可以使用第三方[文件属性任务(HTTP ://filepropertiestask.codeplex.com/)并测试FileIsReadable – 2013-03-20 07:44:00

+0

@OcasoProtal感谢您的链接,但我的客户不会允许我们使用任何第三方工具。因为他们还有其他项目/工作也在运行,这对他们来说将是一个巨大的恐怖。我们已经试图向他推荐其他第三方工具,但他只是希望我们开发相同的功能。 :) – Zerotoinfinity 2013-03-20 07:49:42

回答

1

添加For Loop Container用布尔变量bFileAccessible

  • 的Init表达是@bFileAccessible=False
  • 中的eval表达是@bFileAccessible==False

For Loop Container内添加Script Task与ReadWriteVariable User::bFileAccessible和以下C#脚本(仅显示Main()方法):

public void Main() 
    { 
     try 
     { 
      using (Stream stream = new FileStream("Path\to\your\file", FileMode.Open)) 
      { 
       Dts.Variables["bFileAccessible"].Value = true; 
      } 
     } 
     catch 
     { 
      Dts.Variables["bFileAccessible"].Value = false; 
     } 

     Dts.TaskResult = (int)ScriptResults.Success; 
    } 

你还应该使用一个变量作为文件名,也许有一点等待的时间间隔。有关脚本的更多信息,请参阅here

1

检查文件的修改时间每次和comapre同样与前一个.... 这不是很好的逻辑,但一个好主意,如果没有完美的替代

+1

当生成过程停顿一段时间时,这不起作用。 – 2013-03-20 12:00:59

相关问题