【问题标题】:Add data from other object within SSIS package to populate a field for a table从 SSIS 包中的其他对象添加数据以填充表的字段
【发布时间】:2018-11-27 00:49:22
【问题描述】:

我想做的事情有很多方面,但我认为学习其中的一部分可以让我推导出其余部分。

我有一个 SSIS 包,它使用 powershell 下载一个公开可用的 zip 文件,一个执行脚本以使用 7zip 解压缩,然后数据流将解压缩的文件加载到相应的表中。

我想要做的是将任何一个解压缩文件中的文件名(以及最终文件的其他方面,如创建日期、记录计数等)添加到跟踪摘要级别详细信息的日志表中文件。

如何将此类信息动态存储为包的一部分?派生列?但是输入是什么?谢谢!

【问题讨论】:

  • 您目前如何识别文件名?网上有很多使用 For Each File 容器迭代文件并保存文件名的示例。如果您还想要其他文件属性,那么在 powershell 中构建 it_all_ 可能会更容易。
  • 我猜是因为它在包装中?有没有办法系统地存储然后在同一个包中检索文件 1 of 4 被命名为 xyz.txt 并且有 100 行?
  • 肯定有一种方法可以系统地存储文件名和属性。您的包现在如何知道它必须加载文件 xyz.txt?它是硬编码到那个包中的吗?阅读此stackoverflow.com/questions/38151342/…
  • 好的,我正在使用“平面文件源”的数据流任务类型,它使用连接管理器来查找我刚刚在包中解压缩的四个文件之一。我会读你现在发布的那条笔记。
  • 上面的链接很有帮助,但不是我想要的。我真的只是想将文件的属性存储在一种批处理日志中。

标签: sql-server ssis sql-server-data-tools ssdt-bi


【解决方案1】:

有许多选项可用于通过 SSIS 动态处理文件。以下是一种方法的概述。当然,这可能会有所不同,具体取决于您的具体需求和要求。

  • 添加一个 Foreach 循环容器。在 Collection 窗格上,可以使用 Folder 属性设置 GUI 以及通过Directory 的参数或变量 表达。也可以通过选中“遍历子文件夹”复选框或使用文件夹字段等Recurse 表达式来设置搜索子文件夹。
  • “文件”字段将指示要使用的文件,通配符可以是 用过的。 * 将匹配任意数量的字符。为了 例如,*.csv 将获取所有 csv 文件,而不管名称和 Test*.txt 将返回所有名称以 Test 开头的 .txt 文件, 不管后面有多少或哪些字符。将此限制为 单个字符,使用?FileSpec 表达式将允许 这将通过变量或参数与目录类似地动态设置。
  • “变量映射”窗格将允许设置变量以保存目录中的文件名。添加一个将文件名保存到索引 0 的变量以映射它们。
  • 您表示要存储文件名。可以从“收集”窗口上的“检索文件名”字段控制此细节。正如它们的名字所暗示的那样,Fully Qualified 将保存完整的文件路径,Name and Extension 将返回带有扩展名的文件名,Name Only 只是文件名。
  • 至于文件的其他方面,我建议为此使用脚本任务以获得更多功能。 C# FileInfo 类提供了用于查找有关文件的详细信息的选项,例如创建日期、上次访问文件的时间以及最近写入文件的时间。可以在here 找到更多相关信息。
  • 对于文件中的记录计数,您需要为此创建一个连接管理器并使用包中的数据。我假设这些是平面文件?如果是这样,创建一个平面文件连接管理器,并将 Foreach 循环的变量映射窗格中的相同变量设置为连接管理器的 ConnectionString 表达式,将允许您动态循环每个文件。如果您决定这样做,请确保将Fully Qualified 选项用于“检索文件名”字段。您还需要提前为 Connection Manager 配置正确的列和数据类型。对于 Excel 文件,也可以遵循相同的过程,但是将在 ExcelFilePath 表达式中使用具有文件名的变量。
  • 至于在日志表中存储有关文件的信息,有多种选择。下面是放置在 Foreach 循环中的执行 SQL 任务中的插入语句的一个非常基本的示例。仅当您使用的表与连接管理器的初始目录不同时,才需要 3 部分表名称。 ? 是参数标记(假设这是一个 OLE DB 连接)。在此之后,使用“参数映射”窗格映射存储文件名的相同变量/参数。将方向设置为Input,适当的数据类型(可能是VARCHAR/NVARCHAR),Parameter Name字段为0表示这是SQL语句中的第一个参数(附加?可用于后面的参数SQL 语句,然后根据该字段递增),默认 Parameter Size 可以保留为 -1。同样,这是一个简单的示例,您可能希望存储有关文件及其内容的更多信息,但这可以帮助您入门。

示例 SQL 插入:

INSERT INTO YourDataBase.YourSchema.YourTable (ColumnToHoldFileName)
VALUES (?)

【讨论】:

  • 不知何故,我不知道如何将存储的变量传递给 INSERT 语句。具体语法是什么?为了学习这一步,我想简单地将我的机器名称插入表中的一个空字段中。在执行 SQL 任务编辑器中,我选择“System::MachineName”、方向输入、长数据类型、默认参数名称、参数大小 -1。然后如何将其传递给我的插入语句中的字段?
  • 这是一个 OLE DB 连接,对吗?如果是这样,请使用与上述插入语句相同的语法。 @[System::MachineName] 是一个字符串变量,因此将数据类型更改为 VARCHAR 或 NVARCHAR(如果目标列是 Unicode)。如果这是唯一使用的参数,则参数名称也需要设置为 0。
  • 是的,我没有意识到变量选项不太正确,这成功了!
【解决方案2】:

您可以在循环文件时使用变量来存储文件名,并且在文件加载到表后,您可以使用当前文件名插入/更新日志表。

【讨论】:

    【解决方案3】:

    看其他帖子就知道了。我不得不扩大参数大小...轻松修复!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      • 2020-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多