SSIS Collection中的WildCards {not include}名称为xlsx

问题描述 投票:3回答:2

我有一个在SSIS中构建的进程,它循环遍历Excel文件,并仅从包含名称Report的那些文件中导入数据。

我用作表达式的UserVariable是:*Report*.xlsx,它的工作原理非常好。现在我正在尝试构建类似的循环,但仅适用于不包含文件名中的报告的文件。

*<>Report*.xlsx之类的东西

可能吗?

感谢帮助!

马特

sql-server sql-server-2008 ssis etl ssis-2008
2个回答
2
投票

不幸的是,你无法使用SSIS表达式(类似于*[^...]*.xlsx)来实现这一点,你必须搜索一些变通方法:

解决方法

第一

在进入循环之前使用Execute Script Task获取 - 过滤 - 文件列表然后使用ForEach循环容器循环(Ado枚举器)

  1. 你需要一个类型为User::FilesList的SSIS变量(例如:System.Object)(范围:包)
  2. 在foreach循环容器之前添加一个qazxsw poi并添加qazxsw poi作为ReadWrite变量
  3. 在脚本中编写以下代码: Imports System.Linq Imports System.IO Imports System.Collections.Generic Execute Script Task
  4. 在For Each Loop Container中选择Enumertaion Type作为'From variable Enumerator'并选择User::FilesList变量作为源

游戏内截图

Public Sub Main() Dim lstFiles As New List(Of String) lstFiles.AddRange(Directory.GetFiles("C:\Temp", "*.xlsx", SearchOption.TopDirectoryOnly).Where(Function(x) Not x.Contains("Report")).ToList) Dts.Variables.Item("FilesList").Value = lstFiles Dts.TaskResult = ScriptResults.Success End Sub

FilesList

enter image description here

第二

在每个循环内部添加一个enter image description here来检查文件是否包含enter image description here字符串

  1. 添加Expression Task类型的变量(名称:ExcludeFile)
  2. 在ForEach循环容器内部,在导入Excel文件的DataFlowTask之前添加一个Report组件

System.Boolean

  1. 在表达式任务内部写下以下内容: Expression Task

enter image description here

  1. 双击表达式任务和DataFlowTask之间的连接器,并编写以下表达式 @[User::ExcludeFile] = (FINDSTRING(@[User::XlsxFile], "Report", 1 ) == 0)

enter image description here

注意:没有必要使用@[User::ExcludeFile] == False 来验证这一点,您可以使用Dummy DataFlowTask或脚本任务来检查文件名是否包含您要排除的关键字


1
投票

在循环中,在第一个任务之前放置一个脚本任务。用线连接这两个。右键单击该行并将Constraint Options设置为expression。你的表情看起来像这样......

enter image description here

其中@var是循环可迭代的。

只有没有“报告”的文件才会进入下一步。

引用这个确切的答案。 Expression Task

© www.soinside.com 2019 - 2024. All rights reserved.