【问题标题】:sql server data tools dynamic file name for flat file sourcesql server data tools 平面文件源的动态文件名
【发布时间】:2016-05-12 02:49:04
【问题描述】:

我有一个 ssis 包,它可以将足够简单的数据从文本文件导入到数据库表中。导入文件名需要配置为动态源,因为文件名会改变。所以我的文件名将具有以下模式: bookNames_Shopping_05_02_2016.txt --> bookNames_Shopping_ 将不变,但日期戳会改变

我设置了一个名为 filename 的变量,并且在连接管理器的属性窗口中,我将 ConnectionString 属性设置为 @[User::filename]。如何设置文件名变量以读取连接管理器指向的文件夹中的文件名? 附言我知道它可以在 For Each 循环中完成,但由于我没有多个文件,而是需要处理一个文件,所以我**不想使用 for each 循环。

文件的完整路径:\XYZYUC3312B6\SHARE\Bound\bookNames_Shopping_05_02_2016.txt

【问题讨论】:

  • 因此您有一个动态文件名,但您不想为每个文件枚举器使用常见的 a 习惯用法。我们可以假设最近修改的文件就是您要查找的文件吗?
  • 你说你不想使用 ForEach - 但你没有解释为什么? ForEach 是满足此要求的最佳解决方案。

标签: ssis


【解决方案1】:

应用循环的另一种方法是使用表达式。假设正在读取的单个文本文件的名称中包含 SSIS 包处理它的相同日期,您可以执行以下操作:

  1. 创建一个名为“FileName”的字符串类型的用户变量。
  2. 创建一个名为“bookNames_Shopping”的新连接管理器,指向当前完整路径“\XYZYUC3312B6\SHARE\Bound\bookNames_Shopping_05_02_2016.txt”。
  3. 选择刚刚创建的新连接管理器并为其打开解决方案资源管理器。
  4. 选择表达式。当 Property Expressions Editor 打开时,转到 Property 列并从下拉列表中选择 Connection String。在同一行的表达式下的下一列中,选择浏览按钮。这将打开表达式生成器窗口。
  5. 在“表达式:”正下方的文本框中,输入以下内容:

`"\XYZYUC3312B6\SHARE\Bound\" + @[用户::文件名] + "_" +
RIGHT("0" + (DT_STR, 2, 1252) DATEPART("mm" , GETDATE()), 2) + "_" + RIGHT("0" + (DT_STR, 2, 1252) DATEPART("dd" , GETDATE()), 2) + "_" + (DT_STR, 4, 1252) DATEPART("yy" , GETDATE()) + ".txt"

选择左下角的评估表达式按钮。如果这可行,它应该显示您的完整文件路径,包括当前日期的串联。

\XYZYUC3312B6\SHARE\Bound\bookNames_Shopping_05_04_2016.txt

选择确定按钮,一切就绪。我在 SQL Server 2008R2 下的 BIDS 中运行了这个。如果您使用的是 SQL Server 2012,那么在 Visual Studio 2010 中,您可以直接为 FileName 变量设置相同的表达式。

从现在开始,只需在我们的数据流中应用 bookNames_Shopping 连接字符串。

【讨论】:

  • 哈哈!抱歉 - 这是为了反对最初的问题!现已删除。
  • 感谢用户,我将使用您的解决方案的变体。 - 马特
  • Joe C -- c# 解决方案也很有帮助,但另一个解决方案更接近我正在寻找的。我仍然想给你的答案点 - 我该怎么做? - 马特
  • 点击答案左侧的灰色向上箭头。谢谢。
【解决方案2】:

我什至会为一个文件使用循环,没有害处。另一种选择是使用脚本任务以及 directoryinfo 和 fileinfo 类。传入目录,如果您希望在调用 directoryinfo 时将文件名的静态部分用作文件掩码。

【讨论】:

  • 1.那么除了使用循环或通过脚本任务之外没有其他方法了吗? 2. 我是 ssis/.net 的菜鸟,你能提供一个例子吗?谢谢
  • @DamonMatt 有没有你没有提到的可以帮助某人(SSIS)决定要处理哪个文件的业务规则?如果您的回复是当前日期,如果流程在周末/节假日失败并且直到第二天没有人更正它会发生什么 - 那么您会怎么做?更改服务器时间到昨天?
  • @billinkc 所有有效问题 Bill,我目前没有所有答案。但此时的假设是:1. 每天都会有一个文件,具有以下命名模式 - bookNames_Shopping_05_02_2016.txt 带有动态日期戳 2. 一旦我的包完成,它将文件移动到一个单独的文件夹 3.如果包失败,这不是关键任务,有人会注意到并提请我注意在修复问题后手动重新运行所以基本上在这一点上我需要知道如何动态检测带有模式的文件并存储它在一个变量中 - thx
  • 这是一个使用循环任务的好例子 - simple-talk.com/sql/ssis/…
  • 这是一篇使用 c# 的好文章 - c-sharpcorner.com/uploadfile/99aadd/…
猜你喜欢
  • 1970-01-01
  • 2019-07-19
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多