首页 > 解决方案 > SSIS约束中的多个表达式

问题描述

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

如果runnumber = 1ORrecordcount =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

流量

当前的设置

标签: ssisazure-data-factory-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 属性设置为它们,这样当我运行我的包时我可以看到发生了什么。

-- 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]

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

数 1 数 0

数 4 数 0

数 4 数 4

既然我爱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>

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


推荐阅读