查找并替换字段并为不匹配的记录保留 'Not Available' 默认输出
Lookup and replace a field and leave a 'Not Available' default output for unmatched records
Table 1 有字段 'A'
Table 2 有字段 'B' 和 'C'
Table 3 将收到字段 'A' 和 'D' 的插入,'D' 从 'C' 生成,其中 'A' 匹配 'B' 或为 'A' 没有匹配 'B' 字段的每个记录显示 'Not Available' 字符串。
事实上,我正在尝试在 SSIS 中复制抄写员 DBLookupDefault 行为,但在单个数据流中复制此行为很棘手。
我会将其作为一个查找来处理,并将不匹配选项设置为忽略失败。如果匹配,我们将在 C 列中添加,别名为 D。否则我们将得到 NULL
查找后,我们需要一个派生列来检查我们新生成的 D 列的值。如果它是 NULL,那么我们将修补我们的未知文本。我很懒惰,使用了一个 SSIS 变量来这样做。你想要的表达是
ISNULL([D]) ? @[User::Lookup_Unknown] : [D]
来源查询
SELECT * FROM (VALUES (10), (20), (30), (40))T1(A);
查找查询
我故意排除了 30 这个值。我还必须填充我的字符串以确保我有空间容纳我的不匹配文本。我将派生列设置为 Replace 'D'
SELECT B, CAST(C AS varchar(50)) AS C FROM (VALUES (10, 'Foo'), (20, 'Bar'), (40, 'Blee'))T2(B,C);
比姆
Biml,即商业智能标记语言,描述了商业智能平台。在这里,我们将使用它来描述 ETL。 BIDS Helper,是 Visual Studio/BIDS/SSDT 的免费附加组件,解决了它的许多缺点。在这里我用它来制作一个包,你可以在自己的环境中创建它来与你所做的进行比较。您需要在那里更新第三行以将连接管理器指向有效实例
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<Connections>
<OleDbConnection Name="CM_OLE" ConnectionString="Data Source=localhost\dev2014;Initial Catalog=tempdb;Provider=SQLNCLI10.1;Integrated Security=SSPI;Auto Translate=False;" />
</Connections>
<Packages>
<Package ConstraintMode="Linear" Name="so_29398714">
<Variables>
<Variable DataType="String" Name="Lookup_Unknown">Not Available</Variable>
</Variables>
<Tasks>
<Dataflow Name="DFT Lookup Ignore Failure">
<Transformations>
<!--
Simulate source table
-->
<OleDbSource ConnectionName="CM_OLE" Name="OLE_SRC">
<DirectInput>SELECT * FROM (VALUES (10), (20), (30), (40))T1(A);</DirectInput>
</OleDbSource>
<!--
Lookup Important thing is to ignore failure
Here we exlude 30 from our sample data
Match based on T1.A to T2.B
-->
<Lookup Name="LKP Data" NoMatchBehavior="IgnoreFailure" OleDbConnectionName="CM_OLE">
<DirectInput>SELECT B, CAST(C AS varchar(50)) AS C FROM (VALUES (10, 'Foo'), (20, 'Bar'), (40, 'Blee'))T2(B,C);</DirectInput>
<Inputs>
<Column SourceColumn="A" TargetColumn="B" />
</Inputs>
<Outputs>
<Column SourceColumn="C" TargetColumn="D" />
</Outputs>
</Lookup>
<!--
Add derived column to handle the nulls for missed lookups
-->
<DerivedColumns Name="DER Handle missed lookups">
<Columns>
<Column DataType="AnsiString" Name="D" ReplaceExisting="true">ISNULL([D]) ? @[User::Lookup_Unknown] : [D]</Column>
</Columns>
</DerivedColumns>
<!--
Add a placeholder for my data viewer
-->
<DerivedColumns Name="DER Data Viewer Placeholder"></DerivedColumns>
</Transformations>
</Dataflow>
</Tasks>
</Package>
</Packages>
</Biml>
Table 1 有字段 'A'
Table 2 有字段 'B' 和 'C'
Table 3 将收到字段 'A' 和 'D' 的插入,'D' 从 'C' 生成,其中 'A' 匹配 'B' 或为 'A' 没有匹配 'B' 字段的每个记录显示 'Not Available' 字符串。
事实上,我正在尝试在 SSIS 中复制抄写员 DBLookupDefault 行为,但在单个数据流中复制此行为很棘手。
我会将其作为一个查找来处理,并将不匹配选项设置为忽略失败。如果匹配,我们将在 C 列中添加,别名为 D。否则我们将得到 NULL
查找后,我们需要一个派生列来检查我们新生成的 D 列的值。如果它是 NULL,那么我们将修补我们的未知文本。我很懒惰,使用了一个 SSIS 变量来这样做。你想要的表达是
ISNULL([D]) ? @[User::Lookup_Unknown] : [D]
来源查询
SELECT * FROM (VALUES (10), (20), (30), (40))T1(A);
查找查询
我故意排除了 30 这个值。我还必须填充我的字符串以确保我有空间容纳我的不匹配文本。我将派生列设置为 Replace 'D'
SELECT B, CAST(C AS varchar(50)) AS C FROM (VALUES (10, 'Foo'), (20, 'Bar'), (40, 'Blee'))T2(B,C);
比姆
Biml,即商业智能标记语言,描述了商业智能平台。在这里,我们将使用它来描述 ETL。 BIDS Helper,是 Visual Studio/BIDS/SSDT 的免费附加组件,解决了它的许多缺点。在这里我用它来制作一个包,你可以在自己的环境中创建它来与你所做的进行比较。您需要在那里更新第三行以将连接管理器指向有效实例
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<Connections>
<OleDbConnection Name="CM_OLE" ConnectionString="Data Source=localhost\dev2014;Initial Catalog=tempdb;Provider=SQLNCLI10.1;Integrated Security=SSPI;Auto Translate=False;" />
</Connections>
<Packages>
<Package ConstraintMode="Linear" Name="so_29398714">
<Variables>
<Variable DataType="String" Name="Lookup_Unknown">Not Available</Variable>
</Variables>
<Tasks>
<Dataflow Name="DFT Lookup Ignore Failure">
<Transformations>
<!--
Simulate source table
-->
<OleDbSource ConnectionName="CM_OLE" Name="OLE_SRC">
<DirectInput>SELECT * FROM (VALUES (10), (20), (30), (40))T1(A);</DirectInput>
</OleDbSource>
<!--
Lookup Important thing is to ignore failure
Here we exlude 30 from our sample data
Match based on T1.A to T2.B
-->
<Lookup Name="LKP Data" NoMatchBehavior="IgnoreFailure" OleDbConnectionName="CM_OLE">
<DirectInput>SELECT B, CAST(C AS varchar(50)) AS C FROM (VALUES (10, 'Foo'), (20, 'Bar'), (40, 'Blee'))T2(B,C);</DirectInput>
<Inputs>
<Column SourceColumn="A" TargetColumn="B" />
</Inputs>
<Outputs>
<Column SourceColumn="C" TargetColumn="D" />
</Outputs>
</Lookup>
<!--
Add derived column to handle the nulls for missed lookups
-->
<DerivedColumns Name="DER Handle missed lookups">
<Columns>
<Column DataType="AnsiString" Name="D" ReplaceExisting="true">ISNULL([D]) ? @[User::Lookup_Unknown] : [D]</Column>
</Columns>
</DerivedColumns>
<!--
Add a placeholder for my data viewer
-->
<DerivedColumns Name="DER Data Viewer Placeholder"></DerivedColumns>
</Transformations>
</Dataflow>
</Tasks>
</Package>
</Packages>
</Biml>