2

这是我的文件夹设置。

文件夹结构

这是文件设置

文件结构

这个想法是遍历文件夹并将 FileA 内容放到数据库上的 Table FileA.dbo 中(还有 FileB、FileC 等)。FileName 结构在所有文件夹中都是相同的。

我有这个 ssis 包,我在其中使用 foreachloop-> 数据流解析文件夹。

ssis1 ssis2

我已经检查了我为获取文件名而制定的算法是否有效

REVERSE(Substring(Reverse( @[User::FileName] ),5,LEN( @[User::FileName] ))) == "FileA"

它解析出 .txt 扩展名。下面是我拥有的 foreach 循环的设置。 前锋

要启动整个程序包,我在文件夹中有 .txt 文件,并创建了 foreach 容器循环子文件夹。

初始点

因为,我并不是真正的 SSIS 包开发人员,所以这是我能做的最好的一些研究。我遇到的问题是,它似乎部分工作。

快照是我所拥有的场景的模型,实际上我有超过 200 个文件夹和 50 个文本文件,每个文件都指定将内容转储到相应的命名表中。

但是我在包成功执行后看到的总行数非常低并且不可能是正确的。无论如何要获得它遍历的文件夹数量的计数/列表。另外,我做错了吗?

理想情况下,我只想不必从 .txt 文件开始,而只需将整个内容转到文件夹,获取文件名(我认为我有一个工作代码)并将所有信息转储到 OLEDB目的地。

非常感谢任何帮助,资源链接。

4

1 回答 1

1

解决方案概述

您可以在 foreach 循环中使用一个 DataFlow 任务来实现这一点,但诀窍是您必须从变量中读取源平面文件名和目标 SQL 表名

注意:平面文件结构必须相同,SQL 表结构必须相同


详细解决方案

  1. 右键单击Control Flow窗口,然后单击Variables

在此处输入图像描述

  1. 声明 2 个 SSIS 变量:

    • FlatFilename: 类型String并为随机文件路径分配默认值(即C:\MockFolder\FileA.txt
    • 'SQLTablename : of typeString` 并分配给以下表达式:

这是假设所有目标表都具有相同的架构dbo

 "[dbo].[" + REPLACE(RIGHT( @[User::FlatFilename] , FINDSTRING(REVERSE( @[User::FlatFilename]  ) , "\\", 1) - 1),".txt","") + "]"

在此处输入图像描述

在此处输入图像描述

  1. 在其中添加aForeach Loop Container和a DataFlow Task,点击DataFlow Task属性选项卡上的和,将属性设置Delay ValidationTrue

在此处输入图像描述

  1. 双击Foreach Loop container并选择主目录,文件过滤器*.txt也选择fully qualified检索文件名选项

在此处输入图像描述

  1. 转到变量映射选项卡并选择@[User::FlatFilename]变量

在此处输入图像描述

  1. 添加2个连接管理器

    • FlatFileConnection:一个平面文件连接管理器,通过随机选择一个File (即C:\MockFolder\FileA.txt)来配置它
    • OLEDBConnection:OLEDB 连接管理器,并将其配置到您的目标 SQL Server 数据库
  2. 在 The中,在select选项中DataFlow Task添加 aFlat File Source和 an并选择作为变量名OLEDB DestinationOLEDB DestinationTable name from variable@[User::SQLTablename]

在此处输入图像描述

  1. 在源和目标之间映射列

  2. 单击FlatFileConnection连接管理器窗口中的,按F4显示属性选项卡,单击表达式

在此处输入图像描述

  1. 选择Connection String属性分配给它以下表达式:

    @[user::FlatFilename]
    

在此处输入图像描述

于 2017-12-12T19:08:37.340 回答