SSIS ForEach 循环未循环访问文件夹中的所有项

SSIS ForEach Loop Not Iterating Over All Items in a Folder

提问人:Saman Afaq 提问时间:10/9/2023 最后编辑:billinkcSaman Afaq 更新时间:10/10/2023 访问量:86

问:

我在一个文件夹中有 4 个 excel 文件。2 个有同名的单张,另外 2 个有 2 个同名的表(我想要的数据表同名)。

  • 我在 SSIS 中使用了 ForEach 循环来循环访问文件夹中的所有文件。
  • 我将初始路径分配给一个变量,即 ExcelFilePath。
  • 我在循环容器中配置了这个变量,以便它可以保存文件夹中所有文件的路径。
  • 我已将此变量作为 Excel 连接管理器字符串中 Excel 文件路径属性中的表达式传递。

这是我的项目设计:

Design of my project

但是,当我执行包时,只有第一个数据流对象(即分支)成功执行。我认为这是因为它的路径在我的变量中是硬编码的。所有其他数据流对象都将失败。

执行结果:

Execution Result

原木:

Error: 0xC004701C at COUNTRY_INFO, SSIS.Pipeline: OLE DB
Destination.Inputs[OLE DB Destination Input].Columns[COUNTRY_CODE] has
lineage ID 255 that was not previously used in the Data Flow task.
Error: 0xC004706B at MG_SEND, SSIS.Pipeline: "Excel Source" failed
validation and returned validation status "VS_ISBROKEN". 
Error: 0xC004700C at MG_SEND, SSIS.Pipeline: One or more component failed
validation. Error: 0xC0024107 at MG_SEND: There were errors during
task validation.
Error: 0xC004706B at COUNTRY_INFO, SSIS.Pipeline: "OLE DB Destination"
failed validation and returned validation status "VS_NEEDSNEWMETADATA".

我已将每个组件的 DelayValidation 设置为 True。 RetainSameConnection 在连接字符串属性中为 False。

编辑: 尝试添加带有优先约束箭头的序列容器,以便路径仅重定向到相应的 DFT。 对于所有组件,延迟验证都设置为 True。

设计:

Current Package Design

执行结果如下:Execution Result After Changes

日志:

    Error: 0xC001000E at Package1: The connection "" is not found. This error is thrown by Connections collection when the specific connection element is not found.
Error: 0xC02020EA at Package1, Log provider "SSIS log provider for SQL Server": The connection manager "" is not found. A component failed to find the connection manager in the Connections collection.
Error: 0xC001000E at Package1: The connection "" is not found. This error is thrown by Connections collection when the specific connection element is not found.
Error: 0xC02020EA at Package1, Log provider "SSIS log provider for SQL Server": The connection manager "" is not found. A component failed to find the connection manager in the Connections collection.
Warning: 0x80019002 at Package1: SSIS Warning Code DTS_W_MAXIMUMERRORCOUNTREACHED.  The Execution method succeeded, but the number of errors raised (2) reached the maximum allowed (1); resulting in failure. This occurs when the number of errors reaches the number specified in MaximumErrorCount. Change the MaximumErrorCount or fix the errors.
Information: 0x4004300A at BRANCHES, SSIS.Pipeline: Validation phase is beginning.
Warning: 0x800470C8 at BRANCHES, Excel Source [26]: The external columns for Excel Source are out of synchronization with the data source columns. The column "BRANCH_CODE" needs to be added to the external columns.
The column "BRANCH_NAME" needs to be added to the external columns.
The column "AGENT_ID" needs to be added to the external columns.
The column "MAKER" needs to be added to the external columns.
The column "CHECKER" needs to be added to the external columns.
The column "CREATE_DATE" needs to be added to the external columns.
The column "BRANCH_COUNTRY" needs to be added to the external columns.
The column "CREATE_STATUS" needs to be added to the external columns.
The Excel Source.Outputs[Excel Source Output].ExternalColumns[IS_RECEIVE_ACTIVE] needs to be removed from the external columns.
The Excel Source.Outputs[Excel Source Output].ExternalColumns[IS_SEND_ACTIVE] needs to be removed from the external columns.
The Excel Source.Outputs[Excel Source Output].ExternalColumns[BASE_RECEIVE_CURRENCY] needs to be removed from the external columns.
The Excel Source.Outputs[Excel Source Output].ExternalColumns[COUNTRY_NAME] needs to be removed from the external columns.
The Excel Source.Outputs[Excel Source Output].ExternalColumns[COUNTRY_LEGACY_CODE] needs to be removed from the external columns.
The Excel Source.Outputs[Excel Source Output].ExternalColumns[COUNTRY_CODE] needs to be removed from the external columns.
Error: 0xC004706B at BRANCHES, SSIS.Pipeline: "Excel Source" failed validation and returned validation status "VS_NEEDSNEWMETADATA".
Error: 0xC004700C at BRANCHES, SSIS.Pipeline: One or more component failed validation.
Error: 0xC0024107 at BRANCHES: There were errors during task validation.

请注意,ExcelFilePath 变量最初是为 BRANCHES 路径设置的。此外,我已经通过脚本任务测试了容器,它确实在文件夹中的所有路径上循环。

sql-server excel ssis etl foreach-loop-container

评论

1赞 Brad 10/9/2023
听起来文件的格式不同/标题不同。
0赞 Saman Afaq 10/9/2023
所有文件 + OLEDB 目标都不同。基本上,我正在处理 4 种不同的模式。在这种情况下,ForEach 循环会不起作用吗?
0赞 Ozan Sen 10/9/2023
您为 4 个 Excel 文件创建了 4 个不同的数据流任务?如果是这样,“For each loop”容器有什么用?
0赞 Brad 10/9/2023
正确,假设架构相同,则不能为每个循环设置一个。如果您有 4 个不同的文件,只需创建 4 个不同的数据流任务。如果您需要遍历文件(也许有些文件具有相同的格式),您可以执行 for/each 循环,但需要根据名称在顶部检查要为每个文件运行的数据流任务,然后运行此流,但听起来您只需要 4 个不同的数据流任务,不需要循环。
0赞 Ozan Sen 10/9/2023
@Brad,不,我不是那个意思。4 DFT将是低效和糟糕的设计。每个循环容器一个 DFT 就足够了。将 filePath 放在变量中,并使连接字符串动态化。然后继续为每个文件枚举器配置,并选择所有扩展名为 (*.xlsx) 的 excel 文件,然后将 filePath 变量名称 FilePath 分配给“0”索引。一切似乎都还好。我不明白为什么它失败了。

答:

0赞 billinkc 10/9/2023 #1

数据流基于设计时前提工作,即完全符合设计时值的源数据将被超快速加载并推送到与设计时值匹配的目标中。

SSIS 不能是目标引擎的通用源。这不是产品的设计方式。

每次执行包时都会执行的一个步骤是验证。验证步骤的目标是,如果某些内容不符合构建数据流的协定,则尽早失败。

您可以将要在包启动时进行的验证更改为在任务启动时进行验证。这样,如果要从在前行步骤中创建的源中提取数据,则包将仅在任务开始时运行验证。

这里发生的情况是,您拥有的一个 Excel 连接管理器对第一个数据流任务有效,但对其余任务无效。若要解决此问题,需要指示 SSIS 等待验证。

综上所述,要使您的设计按预期工作:

  • 将 DelayValidation 的 Excel 连接管理器属性更新为 True
  • 将 4 个数据流任务更新为具有 DelayValidation 属性为 True

现在,这 5 个更改不足以使您的流程正常工作。因为当找到 Branches 文件时,COUNTRY_INFO数据流仍然会触发,并且元数据不匹配。

为了纠正这个问题,你需要有一个前体任务,它什么都不做,只是作为一个锚点。我发现序列容器在这里工作得很好

enter image description here

请注意,绿色连接器在序列容器和数据流任务之间有一点 f(x)。这是因为我已将 Evaluation 操作更改为“Expression and Constraint”。

约束是拼图的最后一块。当名称与数据流匹配时,需要使此条件为真。

假设数据流中的单词存在于文件名中,该文件名在 Foreach 枚举器中显示为变量 @[User::ExcelFilePath]

BRANCHES 的表达式如下

FINDSTRING(UPPER(@[User::ExcelFilePath]), "BRANCHES" , 1 ) > 0

即:将 Excel 文件路径的值强制转换为全部大写。如果文件路径中也包含全部大写的单词 BRANCHS,则 FindString 方法将返回一个以 1 或更大的数字开头的数字。如果 FindString 中的数字不为零,则为 TRUE,否则为 false

对每个分支重复此模式。

发生的情况是,只有当枚举预期的文件(然后验证)时,路径才会亮起。错误的文件路径不会亮起,因此不会通过验证。

编辑以解决更新的问题

设计数据流显示你已损坏组件,我不希望执行成功。

评论

0赞 Saman Afaq 10/10/2023
嗨,我已经试过了。使用我当前的结构编辑我的帖子。尽管将 DelayValidation 设置为 True,我仍然收到映射错误。我已经通过脚本任务测试了我的循环,它返回了文件夹中的所有 4 个路径。但是,在包执行时,如果初始路径设置为 BRANCHES 路径,则 BRANCHES DFT 将起作用,并且COUNTRY_INFO DFT 配置将出现映射错误。如果我将 ExcelFilePath 保留为空字符串,则没有 DFT 配置保持正确。我不明白这里的逻辑错误是什么。
0赞 Saman Afaq 10/11/2023
损坏的组件是由于初始设置路径引起的映射错误。你能进一步指导我该怎么做吗?