这是我的文件夹设置。
这是文件设置
这个想法是遍历文件夹并将文件内容放入数据库上的表 File.dbo (还有 FileB、FileC 等)。所有文件夹的文件名结构都相同。
我有这个 ssis 包,我在其中使用 foreachloop-> 数据流解析文件夹。
我已经检查过我制定的获取文件名的算法是否有效
REVERSE(Substring(Reverse( @[User::FileName] ),5,LEN( @[User::FileName] ))) == "FileA"
It parses out the .txt extension. Below is the setup of the foreach loop I have.
为了启动整个包,我在文件夹内放置了 .txt 文件,并创建了 foreach 容器循环子文件夹。
因为,我并不是真正的 SSIS 包开发人员,所以这是我通过一些研究所能做的最好的事情。我遇到的问题是它似乎部分起作用。
这些快照是我所遇到的场景的模型,实际上我有 200 多个文件夹,其中有 50 个文本文件,每个文件都指定将内容转储到各自的命名表中。
但是包成功执行后我看到的总行数非常低并且不可能是正确的。无论如何,是否可以获取它遍历的文件夹数量的计数/列表。另外,我做错了什么吗?
理想情况下,我不想从 .txt 文件开始,而是将整个文件转到文件夹,获取文件名(我认为我有一个工作代码)并将所有信息转储到 OLEDB目的地。
非常感谢任何帮助、资源链接。
解决方案概述
您可以在 foreach 循环中使用一个 DataFlow 任务来实现这一点,但技巧是您必须从变量中读取源平面文件名和目标 SQL 表名称
注意:平面文件结构必须相同,SQL 表必须具有相同的结构
详细解决方案
- 右键单击
Control Flow
窗口并单击Variables
-
声明 2 个 SSIS 变量:
-
FlatFilename
: 类型String
并分配默认值随机文件路径(i.e. C:\MockFolder\FileA.txt
)
- 'SQL表名
: of type
String` 并分配给以下表达式:
这是假设所有目标表具有相同的架构dbo
"[dbo].[" + REPLACE(RIGHT( @[User::FlatFilename] , FINDSTRING(REVERSE( @[User::FlatFilename] ) , "\\", 1) - 1),".txt","") + "]"
- Add a
Foreach Loop Container
and a DataFlow Task
在其中,单击DataFlow Task
并在属性选项卡上设置Delay Validation
财产给True
- 双击
Foreach Loop container
并选择主目录和文件过滤器*.txt
还选择fully qualified
检索文件名选项
- 转到变量映射选项卡并选择
@[User::FlatFilename]
多变的
-
添加2个连接管理器
- FlatFileConnection:一个平面文件连接管理器,通过随机选择一个来配置它
File
(i.e. C:\MockFolder\FileA.txt
)
- OLEDBConnection:一个 OLEDB 连接管理器,并将其配置到您的目标 SQL Server 数据库
In The DataFlow Task
, add a Flat File Source
and an OLEDB Destination
, 在里面OLEDB Destination
select Table name from variable
选项并选择@[User::SQLTablename]
作为变量名
在源和目标之间映射列
单击FlatFileConnection
在连接管理器窗口中,按F4
要显示属性选项卡,请单击“表达式”
-
选择Connection String
属性为其分配以下表达式:
@[user::FlatFilename]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)