【问题标题】:SSIS Using For Loop Container Not Executing Script Task and Data Flow TasksSSIS 使用 For 循环容器不执行脚本任务和数据流任务
【发布时间】:2019-02-28 20:02:54
【问题描述】:

我正在与专家联系,因为我最近的一个项目遇到了困难。我创建了一个 SSIS 包 (2008R2),它使用脚本任务构建 SQL 语句,其中在 SQL 语句中使用变量 (@month1) 来指定成员表中的一个月回顾。我还想使用@month1 变量作为循环容器的“计数器”来指定执行查询的次数。 SQL 查询附加到数据流任务以将这些记录附加到 SQL 服务器数据库上的表中。脚本任务和数据流任务在 for 循环容器之外工作,为 @month1 变量提供初始值,但我无法弄清楚如何使 for 循环容器更新 @month1 "counter" 变量,以便 for每个循环都可以将其用作“计数器”,SQL 语句可以将其用作创建的 SQL 语句中的条件。有人对如何做到这一点有任何想法或例子吗?

** 更新 ** For Loop 容器是问题所在。脚本任务和数据流任务在 For Loop 容器之外工作。它将使用 @month1 的初始变量设置并创建动态 sql 脚本、执行脚本并将数据从源数据库服务器传输到目标源服务器。问题是当我将这些步骤放在 For Loop 容器中时,容器会执行并变为绿色,但不会调用其中的步骤。这就是为什么我认为容器没有读取变量@month1,即使该变量是在包级别设置的。有什么想法吗?

【问题讨论】:

  • 所有表都在同一个服务器吗?如果是这样,我建议您在存储过程中执行此操作,而不是在 SSIS 中。如果您必须在 SSIS 中执行此操作,则需要将此增量放入 迭代表达式 docs.microsoft.com/en-us/sql/integration-services/control-flow/…
  • 嗨尼克,不幸的是,这些表不在同一台服务器上,我的组织不允许“链接服务器”。数据位于我只有读取权限的生产机器上,我将其移动到测试服务器/数据库以进行初始开发和概念验证。我已经更新了 For Loop 容器中的那些字段以指定迭代,但它似乎没有读取变量。
  • 不允许链接服务器是个好主意。所以你肯定需要使用 SSIS。我重新阅读了您的描述,听起来您只需要将数据流 inside for 循环。当您说“似乎没有”之类的话并且您的解释有点模糊时,您似乎确实需要对问题进行更多分析。当您以交互方式运行包时会发生什么?循环没有重复运行还是看不到预期的数据?
  • 嗨,对不起,尼克以为我在最初的帖子中提到了这一点。当放置在 For 循环中时,一切都“运行”成功,因为它变成绿色,但没有数据移动。所以这让我相信该变量没有被读取或可用于 For Loop 容器。我在包级别设置了变量范围,并为 InitExpression 设置了 @[User::month1],为 EvalExpression 设置了 @[User::month1]
  • 尝试将数据流的Delay validation属性设置为true

标签: sql sql-server for-loop ssis ssis-2008


【解决方案1】:

首先,尝试将数据流Delay Validation属性设置为True。如果它仍然不起作用,而不是在 OLEDB 源中将变量作为参数传递,请使用表达式:

  1. 创建一个字符串类型的变量。
  2. 将其EvaluateAsExpression 属性更改为True
  3. 设置表达式类似于:

    "select * from table 
     Where column =" + (dt_str, 50)@[User::month1]
    
  4. 在 OLEDB 源中选择访问模式为 SQL Command from variable 并选择此变量。

请注意,month1 变量不会在不同范围内创建两次,单击数据流任务并检查变量面板是否显示其他变量。

【讨论】:

  • 我会试一试,如果它有效,我会回复评论。感谢您的回复和建议! :)
  • 关于多个范围内的同一个命名变量,这是一个非常好的观点!!!!这很容易做到(尤其是在容器中)并且很难拿起。我总是在包级别制作所有变量以阻止这种情况发生。
【解决方案2】:

我感谢大家的回复,但似乎我在这件事上欺骗了自己。在寻找最复杂的问题时,我忽略了最简单和最明显的问题。我的 For 循环没有执行容器内的步骤的原因是因为我将 @month1 的初始值设置为 3(故意)并且想要循环直到它被解析为 -49。在EvalExpression 设置中,它将评估直到声明为 FALSE ......所以我在那里对@month1 <= -49 的评估已经是错误的。它必须是@month1 > -49,因此一旦它下降到-49,该声明就会是错误的。我对自己做的比我应该承认的要多,不能只见树木不见森林!

【讨论】:

  • 我删除了最后一句话,因为它不是真的。我们都可能犯同样的错误。不要忘记将您的答案标记为已接受,如果您发现其他答案有帮助,请随时投票
猜你喜欢
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
相关资源
最近更新 更多