【问题标题】:SSIS For Loop does not break out of loopSSIS For Loop 不会跳出循环
【发布时间】:2019-10-29 04:40:11
【问题描述】:

我有一个 SSIS 包,我在其中尝试使用 For 循环来检查条件(Web 服务响应)。我在 SSIS 中的 EvalExpression 中有一个条件,并且我在循环内的数据流任务中设置该 EvalExpression 中的变量之一。我还记录了表达式以及表达式中的变量,当 EvalExpression 变为 false 时,循环继续进行。有人可以解释为什么会这样吗?或者我怎样才能在每次迭代中获得真正的 EvalExpression。

这是我的 EvalExpression

(@[User::statusMessageLoop] == 1 && @[User::statusMessageLoopCheck] == 1)

变量 User::statusMessageLoopCheck 在循环的每次迭代中设置,当我希望它跳出循​​环时,我将其设置为 0。

我希望下面的图片有助于解释我的情况,并感谢大家的意见。

for loop properties

conditions under where i want the loop to keep going

break out of the loop when these condition are true

【问题讨论】:

  • 如何设置循环检查变量?
  • @KeithL - 在 For 循环内的数据流任务中,我使用派生列读取 XML Web 服务响应并将名为 statusMessageIndicator 的变量设置为 1 或 0,具体取决于来自 Web 服务的状态消息。在这一步之后,我使用 zappysys 包(设置变量转换,zappysys.com/onlinehelp/ssis-powerpack > 转换 > 设置变量转换)将 LoopCheck 变量设置为 statusMessageIndicator 带回的任何内容。我也知道这是不需要的额外代码,但我正在尝试不同的东西,所以我离开了它。谢谢
  • 我也使用 ZappySys,但没有使用过那个对象。让我给你一个关于如何使用脚本任务的答案。

标签: ssis


【解决方案1】:

我假设您正在正确地将 XML 读入列中并且您知道如何做到这一点。

  1. 添加脚本组件并选择“转换”
  2. 将您的变量(我称我的 isTrue)添加为可读写
  3. 选择您的列作为输入读取
  4. 输入脚本
  5. 添加以下代码来设置你的变量

    Variables.isTrue = Row.isTrue == true ? 1 : 0;
    

这是基本的 if then else 逻辑。

这是使用 SSIS 继承工具设置变量的方式。

如果这不起作用,也许您应该检查以确保您正在正确读取 XML。

编辑:

您需要一个临时变量来保存测试结果,然后您可以在执行后设置包变量。这是代码的屏幕截图:

对此感到抱歉。我和你一起学到了这一课。我通常完全在 C# 中处理所有 XML 和 JSON。

请注意,布尔测试也是在行处理之外声明的。

这假设您也只有一行处理。

【讨论】:

  • 感谢您的回复。我对此不太走运,但这也可能是因为我正在这样做。当我再次提取正在检查状态的 XML 列时,我将其输出添加到脚本组件。在脚本组件中,在 Script 选项卡下,我将 ReadWriteVariables 设置为包含我创建的 isTrue int 变量。在输入列中,我从 XML 中选择 API 响应变量。在 Input0_ProcessInputRow 类下的编辑脚本中,我有 (1 of 2)
  • (2 of 3) Variables.isTrue = Row.OracleResponse == "succeeded" || Row.OracleResponse == "错误" || Row.OracleResponse == "警告" ? 1:0;当我保存并运行该过程时,我收到以下错误消息:错误:0xC0047062 在 Get ESS Job Status For Loop (API),脚本组件 [136]:Microsoft.SqlServer.Dts.Pipeline.ReadWriteVariablesNotAvailableException:变量集合已锁定读写访问在 PostExecute 之外不可用。
  • (3 of 3) @KeithL 错误代码 DTS_E_PROCESSINPUTFAILED。处理输入“输入 0”(146) 时,组件“脚本组件”(136) 上的 ProcessInput 方法失败,错误代码为 0x80131600。已识别的组件从 ProcessInput 方法返回错误。该错误是特定于组件的,但该错误是致命的,将导致数据流任务停止运行。在此之前可能会发布错误消息,其中包含有关失败的更多信息。
  • 你能添加一张你的数据流的图片吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-04
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多