【问题标题】:SSIS - Precedence Constraint Editor - ExpressionSSIS - 优先约束编辑器 - 表达式
【发布时间】:2020-04-23 16:29:52
【问题描述】:

我创建了一个 SSIS 包来从文件夹中挑选平面文件并导入 SQL 数据库。他们有 5 个遵循此命名方案的注释文件:

ABS_Comment-name.txt

我需要连字符 (-) 之前的文本。

 @[User::FileName] == "ABS_Comment" 

注意:此表达式将在 For Each 循环容器中的 Precedence Constraint Editor 中使用

如果您需要更多信息,请告诉我

【问题讨论】:

  • 你可以这样做,但它可能更适合在掩码为 ABS_Comment*.txt 的文件夹中使用 foreach(file)
  • FileName 将包含如图所示的文件名 (ABS_Comment-name.txt)?没有路径信息?
  • 我认为您使用的术语优先约束是错误的。这就是您在对象之间的连接箭头上编写表达式的地方。我在 foreach(file) 对象中应用此逻辑时使用了术语“掩码”。

标签: ssis dataflow foreach-loop-container


【解决方案1】:

创建额外的 SSIS 变量不会花费您任何成本,并且大大简化了调试。

我将添加一个名为BaseFileName 的新 SSIS 变量,其目的是提供查看针对 FileName 的字符串操作结果的能力。如果您在对象/优先级约束上构建它,您将无法检查它。

根据您的情况,您需要使用最左边的字符,并且需要找出连字符在字符串中的位置。 [LEFT][1] 表达式或 [SUBSTRING][1] 将满足采用初始 N 个字符。 [FINDSTRING][1] 表达式用于确定搜索字符(连字符)的位置。

LEFT(@[User::FileName, FINDSTRING(@[User::FileName], "-", 1))

该表达式可能偏离 1,因此请检查结果字符串并根据需要在 FINDSTRING 的结果中添加/删除 1。

对于 SSIS 2005 上的人来说,LEFT 不存在,因此对 SUBSTRING 的重写如下(同样需要注意检查是否被取消)

SUBSTRING(@[User::FileName, 1, FINDSTRING(@[User::FileName], "-", 1))

此时,您简化的优先约束是

@[User::BaseFileName] == "ABS_Comment"

【讨论】:

    【解决方案2】:

    Billinkc 为如何获取您正在寻找的字符串提供了一个很好的答案,但我认为您正在尝试为以 ABS_Comment 开头的文件名运行 foreach 循环:

    这是一个 foreach 循环编辑器:

    这里有两件事要设置:

    1. 设置文件夹
    2. 使用 ABS_Comment*.txt 掩码设置文件

    然后你必须将你的文件名设置为一个变量:

    然后您需要在平面文件连接上设置表达式以使用您的变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      • 1970-01-01
      相关资源
      最近更新 更多