SSIS Construction中的多个表达式
我有两个变量:user::runnumber和user::recordcount 如果SSIS Construction中的多个表达式,ssis,azure-data-factory-2,Ssis,Azure Data Factory 2,我有两个变量:user::runnumber和user::recordcount 如果runnumber=1或recordcount=0任务A应该执行。 任务A是一个“执行包任务”,否则运行正常。 在任何其他场景中,都应该跳过任务 我认为使用表达式(@[User::runnumber]==1 | |@[User::record_count]!=0)将任务设置为禁用会起到作用,但事实并非如此。 有没有办法解决这个问题 runnumber = 1 recordcount = 0 --> tas
runnumber=1
或recordcount=0
任务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
使用优先级约束来控制任务a的执行。因此,如果控制流如下所示: 双击两个任务之间的约束箭头,将求值选项设置为“表达式”,并添加以下表达式:
@[User::runnumber]==1 | |@[User::recordcount]==0
编辑:
添加优先约束的配置:
有两种方法:优先约束和禁用属性 如果没有离开任务的路径,则它们是等效的方法。如果有一个“下游”任务应该运行,而不管是否触发了Execute Package任务,那么Disabled属性可能最有意义。关闭先例约束将禁用整个逻辑分支,而设置为禁用将跳过该任务以执行 对于提供的控制流,我只希望PC成功并使用Disabled属性 残疾人的属性总是让我感到困惑,因为它的消极性 无论您采用哪种方法,我都建议创建布尔变量来跟踪是否满足“运行执行包任务”的规则。您可以独立于切换任务是否运行的逻辑进行测试 我认为您的核心问题可能是
@[User::record\u count]=0
您的业务规则是当记录计数为零时,那么它应该是“是”,但这是该值的倒数
为了简单起见,我创建了3个SSIS变量,即布尔类型的DisableExecutePackageTask,并通过表达式定义它们
- EnableEPTRuleRunNumber
@[User::runnumber]==1
- EnableEPTRuleRecordCount
@[User::record\u count]==0
- EnableEPT
@[User::EnableEPTRuleRunNumber]| |@[User::EnableEPTRuleRecordCount]
“RunNumber”+(DT_WSTR,5)@[User::RunNumber]+“规则是”+(DT_WSTR,10)@[User::EnableEPTRuleRunNumber]
--LabelRecordCount“RecordCount”+(DT_WSTR,5)@[User::record_count]+“规则是”+(DT_WSTR,10)@[User::EnableEPTRuleRecordCount]
然后,我将更改变量runnumber的值并记录_count以评估场景
既然我爱你
0
0
@[用户::runnumber]==1
@[用户::记录计数]==0
@[User::EnableEPTRuleRunNumber]| |@[User::EnableEPTRuleRecordCount]
“RunNumber”+(DT_WSTR,5)@[User::RunNumber]+“规则是”+(DT_WSTR,10)@[User::EnableEPTRuleRunNumber]
“RecordCount”+(DT_WSTR,5)@[User::record_count]+“规则是”+(DT_WSTR,10)@[User::EnableEPTRuleRecordCount]
!@[用户::EnableEPT]
@[用户::LabelRecordCount]
@[用户::LabelRunNumber]
在您关闭并重新打开包之前,任务的名称并不总是更新的,因为随着变量的变化,它们不会得到重新评估自己的脉冲,但它确实起作用。我就是这么想的。但它不会触发。它分别在两种情况下触发。但不是在两个组合使用| |哦。。。你在描述中说或。如果需要逻辑和,请使用
&&
。如果我理解正确,请告诉我。如果runnumber=0或recordcount=0,我会触发它。但它不会那样做。如果我让它在runnumber==1上运行,它会做它需要做的事情。如果我将其设置为recordcount==0,则它仅在recordcount=0时运行。但是,如果我使用| |将两者结合起来,它不会在任何一个上触发……我对任务应该在什么条件下运行感到困惑。您是否介意在问题中添加一个表,显示不同的值和预期的结果?添加了一个表,其中包含可能的结果和预期的结果。哦,我们是使用先决条件(如Mark所示)还是使用表达式来控制任务的Disable(d)属性?两者都有。上一个任务应已成功完成。(约束)表达式控制是否执行任务A。(表情)我如何上传图片?喜欢你的解决方案!尤其是BIML部分。从中学到了很多。然而,在阅读您的帖子时,我发现只有一种情况下任务会被执行,所以我使用了disabled属性并将其设置为:@[User::runnumber]=1&&@[User::record\u count]=0
<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>