有两种方法可以解决这个问题: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>
在您关闭并重新打开包之前,任务的名称不会总是更新,因为它们没有得到脉冲来随着变量的变化而重新评估自己,但它确实有效。