【问题标题】:Inserting .DBF Files from different folder structure with their respective FilePath using SSIS?使用SSIS从不同的文件夹结构中插入带有各自FilePath的.DBF文件?
【发布时间】:2016-04-01 00:16:42
【问题描述】:

我正在创建 SSIS 包并执行以下操作,到目前为止,我的 SSIS 包可以很好地仅从一个文件夹位置插入来自“.DBF”文件的记录(我正在使用数据流任务到控制流和 OLE DB 源/读取 .DBF 文件并将其插入的目标)。但是,我无法弄清楚如何使其适用于 20 个站点,例如:我有 20 个“.DBF”文件存储在以下结构中:

1. E:\DBF Files\Site1\Data\records.DBF
2. E:\DBF Files\Site2\Data\records.DBF
3. E:\DBF Files\Site3\Data\records.DBF
4. E:\DBF Files\Site4\Data\records.DBF

以此类推,直到 Site20(此处文件名保持不变,但内容因站点而异)。

我的 SQL Server 中有“records.dbf”文件的表,结构如下:

记录表:

Product_Name          Price          FilePath          FileName
---------------------------------------------------------------

现在在这里,如何使用 SSIS 处理来自不同站点的这些文件以存储在我的记录 sql 表中,并使用其各自的 FilePath??

P.S 文件名将始终保持不变,路径将更改为“Like Site 1”

【问题讨论】:

  • 你可以通过脚本任务来完成。
  • @TabAlleman 怎么样?你能详细说明一下吗?
  • 现在我再次查看您的问题,我真的不确定您在问什么。什么是第 1 列和第 2 列?文件路径/名称是否会更改,或始终保持不变?
  • @TabAlleman 这里文件名将始终保持不变,只有文件路径会改变,这里改变的变量是“Site1,Site2..etc”,对于文件包含的列“属性基本上”
  • 戴夫走在了正确的轨道上。我手边没有快照,但尝试使用谷歌搜索了解 SSIS 中的 ForEachLoop 容器,以及如何在 SSIS 的平面文件数据源中使用表达式。这应该告诉你所有你需要知道的。

标签: sql sql-server ssis sql-server-2012 ssis-2012


【解决方案1】:

为 SSIS 工具箱抓取一个 For Each Loop 容器,并将其拖到控制流设计器上。

双击For Each container调出编辑器,点击左侧菜单中的Collection标签

Enumerator设置为Foreach Item Enumerator,然后点击右下角的Columns按钮。

单击 添加 按钮并使用默认值,即 Column 0String。单击确定返回上一个对话框。在新的 Column 0 列中,每行添加一个文件夹路径。

接下来点击左侧菜单中的Variable Mappings标签,在Variable列的下拉菜单中选择New Variable .再次使用默认值,但在我的示例中我称之为 dbf_path 的名称除外。

接下来点击确定以完成For Each。现在对我来说有点困难,因为我不知道你目前有哪些任务正在为一个文件工作。无论您在做什么,用鼠标选择它,然后将它拖放到 For Each 容器

对于需要使用文件路径的每个或多个任务,请执行以下操作: 双击它进行编辑,在左侧菜单中选择表达式,然后单击表达式,然后单击省略号。

属性表达式编辑器中的属性下拉列表中,您需要找到保存此任务文件路径的属性。这些名称并不总是显而易见的,并且可以在不同的任务中称为不同的事物。在我的示例中,我使用的是我认为是源属性的文件系统任务。

单击“表达式”列中的省略号并添加一个表达式,该表达式由您的路径变量连接一个包含文件名称的字符串组成。需要注意的一件事是反斜杠具有特殊含义,因此如果您的字符串包含任何内容,则必须使用第二个反斜杠对其进行转义。

现在,当您运行包时,For Each 将遍历您定义的每个路径,并将其存储在任务将引用的变量中。

【讨论】:

  • 感谢您的详细解释,但在这里您遗漏了一部分问题,正在从相应文件夹中读取这些 .DBF 文件并将它们插入到一个名为 Records 的表中,该表具有相同的结构但具有不同的内容
  • 正如我在回答中所说的,我不知道您当前正在使用哪些任务,因为您没有在问题中提供详细信息,但是我在回答中已经回答了这一点,我声明For Each 中需要路径的任何任务都可以使用该变量。因此,例如,如果您想将文件路径存储在表中,最简单的方法是将派生列转换任务插入数据流中,创建一个名为 FilePath 的新列,然后将表达式拖入您的变量中。
  • 我已经声明我想一次性将 20 个(.DBF)文件与各自的 FilePath 插入到我的“记录 SQL 表”中,而不是编写 20 个转换来完成这项工作。是否可以你上面的答案或者我需要做一些额外的改变。?? 正在使用数据流任务到控制流和 OLE DB 源/目标来读取 .DBF 文件并将其插入。
  • 是的,它会 - For Each 循环中的一个转换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 2022-09-26
  • 1970-01-01
相关资源
最近更新 更多