ssis - SSIS约束中的多个表达式
问题描述
我有两个变量:user::runnumber 和 user::recordcount。
如果runnumber = 1
ORrecordcount =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
解决方案
有两种方法可以解决这个问题: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 的值来评估场景。
既然我爱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>
在您关闭并重新打开包之前,任务的名称并不总是更新,因为它们不会随着变量的变化而重新评估自己,但它确实有效。
推荐阅读
- sql - 如何识别不符合特定标准的组?
- ios - 应用程序因 UIApplicationEndBackgroundTaskError 而崩溃
- php - 生产环境连接数据库出错
- c - 在调用 execve() 时,环境的各个方面基于什么保持?
- java - 在 Java 中实例化内部类是如何真正起作用的?
- amazon-web-services - AWS Glue 无法从爬虫创建数据库:权限被拒绝
- amazon-ec2 - 以编程方式安装作曲家,适用于 vagrant 但不适用于 EC2 实例
- c# - 访问作为对象 C# 中的字段的对象的字段
- xml - Spark-xml 在读取处理指令时崩溃
- android-studio - 如何禁用 Android Studio“Gradle 调用完成”通知?