2

我开发了一个消耗平面文件的 ETL。平面文件的大小从 250 MB 到 300 MB 不等。当文件夹中存在文件时,它工作得非常好。但是当文件处于生成模式时它会失败。

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

只有在文件生成完全完成后才触发 SSIS 包的最佳方法是什么?

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

4

2 回答 2

1

添加一个For Loop Container布尔变量bFileAccessible

  • 初始化表达式是@bFileAccessible=False
  • Eval 表达式是@bFileAccessible==False

在里面For Loop Container添加一个Script TaskReadWriteVariableUser::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;
    }

您还应该为文件名使用一个变量,也许还有一点等待间隔。有关脚本的更多信息,请参见此处

于 2013-03-20T09:38:02.980 回答
1

每次检查 FIle 修改时间,并与前一个相同....这不是很好的逻辑,但如果没有完美的替代方案,这是一个好主意

于 2013-03-20T10:07:23.643 回答