SSIS 约束中的多个表达式

multiple expressions in SSIS constriant

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

如果 runnumber = 1recordcount =0 任务 A 应该执行。 任务 A 是一个 'execute package task',否则运行良好。 在任何其他情况下,应跳过任务 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

使用优先约束来控制任务 A 的执行。因此,如果您的控制流如下所示:

双击两个任务之间的约束箭头,将Evaluation Option设置为“Expression”,添加如下表达式: @[User::runnumber] == 1 || @[User::recordcount] == 0

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

有两种解决方法:优先约束和禁用属性。

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

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

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

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

的逻辑进行测试

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

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

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

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

-- LabelRunNumber "RunNumber " + (DT_WSTR, 5) @[User::runnumber] + " rule is " + (DT_WSTR, 10) @[User::EnableEPTRuleRunNumber] -- LabelRecordCount "RecordCount " + (DT_WSTR, 5) @[User::record_count] + " rule is " + (DT_WSTR, 10) @[User::EnableEPTRuleRecordCount]

然后我会更改变量 运行number 和 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>

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