【问题标题】:Get the date from Excel File name in a Variable从变量中的 Excel 文件名中获取日期
【发布时间】:2018-04-26 12:35:30
【问题描述】:

我需要创建一个 SSIS 包,该包将从 Excel 源中提取数据并将其加载到 SQL Server 目标中。

Excel 文件名会有一个日期,通常文件名类似于emp_20110909.xls,其中11 是月份,09 是日,09 是年。现在我想捕获这个日期,并在目标表中添加另一个名为“Extracted_Date”的列,并填充从这个 excel 中提取的所有记录的捕获日期。

谁能告诉我这个过程怎么做?

【问题讨论】:

标签: excel ssis


【解决方案1】:

Excel 作为数据源没有为此提供明确的功能,而平面文件源则提供。我在What is the name of a file

下写了这篇博客

您要做的是让 Foreach 文件枚举器在文件夹中查找您的 Excel 文件。将当前找到的文件的值分配给像@[User::CurrentFileName] 这样的变量。这看起来像C:\ssisdata\mySource\Input\emp_110909.xls

您将更新 Excel 连接管理器以在 ExcelFilePath 属性上添加一个表达式,因此现在随着 @[User::CurrentFileName] 的值发生变化,实际引用的文件也会发生变化。您可以在网上找到大量使用 foreach 枚举器的参考资料或search my answers

您需要的最后一点是解析 CurrentFileName 的值以查找年份 (11)、月 (09) 和日 (09) 元素 - 或者您可能希望将其作为一个大值 (110909)。为此,我将创建 4 个变量:FileDate、FileYear、FileMonth、FileDay 都作为字符串。是的,它们是数字,但对于我们的使用,将它们视为字符串会更容易。

FileDate 将对应于从 emp 到 xls 期间的下划线之间的所有内容。我们将使用 SSIS 的表达式语言来执行此操作,特定元素将是 SUBSTRINGFINDSTRINGLEN

SUBSTRING(@[User::CurrentFileName], FINDSTRING(@[User::CurrentFileName], "emp_", 1) + LEN("emp_"),  6)

在这里,我很懒惰,只是“知道”长度是 6 并且这样硬编码。如果有人给我们一个 emp_20110909.xls,这将失败。前面的表达式将通过找到句点的位置然后从emp_位置计算长度来修改。

既然我们知道了 FileDate,我们可以使用 SUBSTRING 来分割出前 2 个元素代表年份,接下来的 2 个代表月份,最后两个代表日期。

然后,您可以通过派生任务将这些值注入您的数据流,或通过执行 SQL 任务推送到审计表中。

【讨论】:

  • 如果您知道文件以 yymmdd.xls 结尾,那么您可以 left(right(fname,10),6)
  • @KeithL 正确,虽然 LEFT 在 SSIS 表达式语言中不存在,直到......我不记得了。无论如何,点数
  • 这并不是要损害您的解决方案。
  • 感谢您的回复。你能以图表的形式向我提供所有步骤吗?
猜你喜欢
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 2013-01-25
  • 2020-07-19
  • 2023-03-26
  • 2015-12-25
相关资源
最近更新 更多