【问题标题】:multiple expressions in SSIS constriantSSIS约束中的多个表达式
【发布时间】:2020-10-12 12:57:32
【问题描述】:

我有两个变量:user::runnumber 和 user::recordcount。

如果应该执行 runnumber = 1 OR recordcount =0 任务 A。 任务 A 是一个“执行包任务”,否则运行良好。 在任何其他情况下,都应跳过任务 A。

我认为使用表达式 (@[User::runnumber]==1 || @[User::record_count]!=0) 将任务设置为禁用可以解决问题,但事实并非如此。 关于如何解决这个问题的任何想法?

runnumber = 1 recordcount = 0 --> task A
runnumber = 1 recordcount = 100 --> task A
runnumber = 4 recordcount = 0--> task A
runnumber = 4 recordcount = 4--> skip task A

【问题讨论】:

  • 哦,我们是使用先例约束(如 Mark 所示)还是使用表达式来控制任务的 Disable(d) 属性?
  • 两者。上一个任务应该已经成功完成。 (约束)表达式控制是否执行任务 A。 (表情)如何上传图片?

标签: ssis azure-data-factory-2


【解决方案1】:

使用优先约束来控制任务 A 的执行。因此,如果您的控制流看起来像这样:

双击两个任务之间的约束箭头,将评估选项设置为“表达式”并添加以下表达式: @[User::runnumber] == 1 || @[User::recordcount] == 0

编辑: 添加优先约束的配置:

【讨论】:

  • 我就是这么想的。但它不会触发。它分别在两种情况下触发。但不是将两者结合使用 ||
  • oooh... 你在描述中说OR。如果你想要一个逻辑 AND 使用&&。如果我理解正确,请告诉我。
  • 我希望它在 runnumber = 0 或 recordcount = 0 时触发。但它不会那样做。如果我让它在 runnumber ==1 上运行,它会做它需要做的事情。如果我将它设置为recordcount == 0,它仅在recordcount = 0时运行。但是如果我使用||将两者结合起来它也不会触发......
  • 我对任务应该在什么条件下运行感到困惑。您介意在您的问题中添加一个表格,显示不同的值和预期结果吗?
  • 添加了可能结果和期望结果的表格
【解决方案2】:

有两种方法可以解决这个问题:Precedence Constraints 和 Disabled 属性。

如果没有离开任务的路径,那么它们是等效的方法。如果有一个“下游”任务应该运行而不管是否触发了 Execute Package Task,那么 Disabled 属性可能最有意义。关闭先例约束会禁用整个逻辑分支,而设置 Disabled 只会跳过该任务以执行。

对于提供的控制流,我只需让 PC 成功并使用 Disabled 属性。

Disabled 的属性总是让我感到困惑,因为它是消极的。

无论您采用哪种方法,我都建议创建布尔变量来跟踪是否满足“运行执行包任务”的规则。您可以独立于切换任务是否运行的逻辑进行测试。

我认为您的核心问题可能是 @[User::record_count]!=0 您的业务规则是当 record_count 为零时,应该是肯定的,但这是相反的。

为简单起见,我创建了 3 个 SSIS 变量,布尔类型的 DisableExecutePackageTask 并通过表达式定义它们

  • 启用 EPTRuleRunNumber @[User::runnumber]==1
  • 启用EPTRuleRecordCount @[User::record_count]==0
  • 启用EPT @[User::EnableEPTRuleRunNumber] || @[User::EnableEPTRuleRecordCount]

我还定义了两个变量,我称之为标签,并将两个容器的 Name 属性设置为它们,这样当我运行我的包时我可以看到发生了什么。

-- 标签运行号"RunNumber " + (DT_WSTR, 5) @[User::runnumber] + " rule is " + (DT_WSTR, 10) @[User::EnableEPTRuleRunNumber] -- 标签记录计数"RecordCount " + (DT_WSTR, 5) @[User::record_count] + " rule is " + (DT_WSTR, 10) @[User::EnableEPTRuleRecordCount]

然后我会更改变量 runnumber 和 record_count 的值来评估场景。

因为我爱Biml

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Packages>
<!-- 
EPT should be ON when 
record count is non zero
or run number is 1

It should be OFF when
record count is zero
and run number is not 1 
-->
        <Package Name="SO_62518244">
            <Variables>
                <Variable Name="runnumber" DataType="Int32">0</Variable>
                <Variable Name="record_count" DataType="Int32">0</Variable>
                <Variable Name="EnableEPTRuleRunNumber" DataType="Boolean" EvaluateAsExpression="true">@[User::runnumber]==1</Variable>
                <Variable Name="EnableEPTRuleRecordCount" DataType="Boolean" EvaluateAsExpression="true">@[User::record_count]==0</Variable>
                <Variable Name="EnableEPT" DataType="Boolean" EvaluateAsExpression="true">@[User::EnableEPTRuleRunNumber] || @[User::EnableEPTRuleRecordCount]</Variable>
                <Variable Name="LabelRunNumber" DataType="String" EvaluateAsExpression="true">"RunNumber " + (DT_WSTR, 5) @[User::runnumber] + " rule is " + (DT_WSTR, 10) @[User::EnableEPTRuleRunNumber]</Variable>
                <Variable Name="LabelRecordCount" DataType="String" EvaluateAsExpression="true">"RecordCount " + (DT_WSTR, 5) @[User::record_count] + " rule is " + (DT_WSTR, 10) @[User::EnableEPTRuleRecordCount]</Variable>
            </Variables>
            <Tasks>
                <Container Name="Before"/>
                <Container Name="EPT Placeholder">
                    <Expressions>
                        <Expression ExternalProperty="Disable">!@[User::EnableEPT]</Expression>
                    </Expressions>
                    <PrecedenceConstraints>
                        <Inputs>
                            <Input OutputPathName="Before.Output" />
                        </Inputs>
                    </PrecedenceConstraints>
                </Container>
                <Container Name="After">
                    <PrecedenceConstraints>
                        <Inputs>
                            <Input OutputPathName="EPT Placeholder.Output" />
                        </Inputs>
                    </PrecedenceConstraints>
                </Container>
                <Container Name="Debug RecordCount">
                    <Expressions>
                        <Expression PropertyName="Name">@[User::LabelRecordCount]</Expression>
                    </Expressions>
                </Container>
                <Container Name="Debug RunNumber">
                    <Expressions>
                        <Expression PropertyName="Name">@[User::LabelRunNumber]</Expression>
                    </Expressions>
                </Container>
            </Tasks>
        </Package>
    </Packages>
</Biml>

在您关闭并重新打开包之前,任务的名称不会总是更新,因为它们没有得到脉冲来随着变量的变化而重新评估自己,但它确实有效。

【讨论】:

  • 喜欢您的解决方案!特别是BIML部分。从中学到了很多。但是,在阅读您的帖子后,我发现只有一种情况下执行任务,所以我确实使用了 disabled 属性并将其设置为:@[User::runnumber]!=1 && @[User::record_count]! =0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 2022-11-04
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多