我可以在 SSIS 中抑制“对于每个文件的枚举器为空”警告吗?

Posted

技术标签:

【中文标题】我可以在 SSIS 中抑制“对于每个文件的枚举器为空”警告吗?【英文标题】:Can I suppress the "For each file enumerator is empty" warning in SSIS? 【发布时间】:2018-01-25 23:55:08 【问题描述】:

我有一个将文件加载到数据库中的 SSIS 包 (SQL 2016)。

在包的开头,我有一个 Foreach 循环容器(Foreach 文件枚举器)。此循环检查错误文件夹中是否有任何文件。期望的条件是错误文件夹中没有文件。

ETL 运行良好。但是,当错误文件夹中没有文件时,Foreach 循环容器会生成警告:

Foreach 文件 - 检查错误文件夹:警告:对于每个文件 枚举器为空。 For Each File 枚举器没有找到任何 匹配文件模式的文件,或者指定的目录是 空。

既然这是理想的情况(没有文件),而且我的控制流以任何一种方式处理这种情况,有没有办法抑制这个警告?

想要取消警告的原因是因为包上的警告计数始终为 1。但是,有时 SSIS 警告很重要(例如,当字段不同步时)。我不希望包装总是带有警告,因为它们可能掩盖其他真正的问题。

这听起来是件小事,所以我想肯定会有办法,但我还没有找到。我尝试在 Foreach 循环上设置 OnWarning 事件处理程序并将 Propagate 设置为 False。但是当包运行时,警告仍然算作警告。

【问题讨论】:

嗯,不是吗?那么就没有文件可以循环了 我会留下这个。该警告是一个真实的事实,表明它已尝试过。 另一种情况可能是,如果您定期检查文件,但如果没有文件,这不是问题。 警告是事实,但被警告的条件已经在控制流中处理。升级已处理的警告是不可取的。 我的一个想法是在文件夹中保留一个空文件,而不是检查 0 个文件,而是检查是否只有 1 个文件。这将解决我在错误文件夹中检查文件的情况。它在其他情况下没有帮助,例如定期检查新文件。 【参考方案1】:

我认为解决这个小问题的最好方法是编写一个非常小的脚本任务。只需将带有文件夹路径的输入变量传递到脚本任务中,检查文件计数并返回输出变量,然后使用带有表达式的优先约束

Dts.Variables["User::GoFurther"].Value = Directory.GetFiles(Dts.Variables["User::Path"].Value.ToString()).Any();

【讨论】:

我的 IDE 未找到 Any 方法,因此我使用以下方法查找 xlsx 文件: string[] files = Directory.GetFiles(Dts.Variables["User::MyPath"].Value .ToString(), "*.xlsx"); MessageBox.Show(files.Length.ToString()); @Unbound,你可能需要添加 System.Linq 命名空间才能使用此方法 @Vladimir Semashkin - 好一个 :-)

以上是关于我可以在 SSIS 中抑制“对于每个文件的枚举器为空”警告吗?的主要内容,如果未能解决你的问题,请参考以下文章

我们可以在 SQL Server 中使用 Attunity oracle 连接部署 SSIS 吗?

SSIS序列容器

使用带有 SSIS 的 FTP 上传文件

在函数中抑制 cout 输出

在 SSIS 中最快加载 2000 个文件的最佳方法

在 SSIS .dtsx 包中查找表名