【问题标题】:Import multiple flat files to multiple SQL Tables将多个平面文件导入多个 SQL 表
【发布时间】:2018-05-26 12:11:41
【问题描述】:

这是我的文件夹设置。

这是文件设置

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

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

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

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

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

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

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

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

但是我在包成功执行后看到的总行数非常少而且不可能是正确的。 无论如何要获得它的文件夹数的计数/列表穿越了。还有,我是不是做错了什么?

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

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

【问题讨论】:

  • 是的,这可以仅使用一个具有动态源和目标的数据流任务来完成。我会用截图给出详细的答案,但是你要等一段时间,因为它需要时间
  • 非常感谢@Hadi。我等着呢

标签: sql-server ssis etl flatfilesource oledbdestination


【解决方案1】:

解决方案概述

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

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


详细解决方案

  1. 右击Control Flow窗口并点击Variables

  1. 声明 2 个 SSIS 变量:

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

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

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

  1. 在里面添加Foreach Loop ContainerDataFlow Task,点击DataFlow Task,在属性选项卡上,将Delay Validation属性设置为True

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

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

  1. 添加 2 个连接管理器

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

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

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

  1. 选择Connection String 属性,为其分配以下表达式:

    @[user::FlatFilename]
    

【讨论】:

  • 我正要根据你的回答设计一个包。但是这个东西会遍历子文件夹吗?请原谅我对 ssis 知识的掌握相对较弱,但我认为我们需要通过 Foreach 循环遍历子文件夹,还是这样做可以解决?
  • 是的,只需检查 foreach 循环容器中的遍历子文件夹选项
  • 哦,这绝对帮到了老兄。万分感谢。会做。还在学习中,谢谢!
  • 你好朋友。如果不是服务器部分,有没有一种方法可以在遍历所有文件夹后将所有 FileA(s)到一个文件夹,将所有 FileB(s)到另一个文件夹等我在这里提出了一个更新的问题stackoverflow.com/questions/47798748/…
  • 在foreach循环中将*.txt改为FileA.txt
猜你喜欢
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 2011-06-04
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多