查找并替换字段并留下“不可用”字样。不匹配记录的默认输出

时间:2015-04-01 19:00:38

标签: ssis

表1包含字段' A'

表2包含字段' B'和' C'

表3将收到字段' A'和' D' D' D'由' C'生成在哪里' A'比赛' B'或显示“不可用”'每个记录的字符串,其中' A'没有匹配的' B'字段。

我实际上是想在SSIS中复制一个抄写DBLookupDefault行为,但在单个数据流中复制这种行为很棘手。

1 个答案:

答案 0 :(得分:1)

我会将此作为Lookup接近,将no match选项设置为Ignore Failure。如果我们匹配,我们将添加C列,别名为D.否则我们将为NULL

enter image description here

查找之后,我们需要一个派生列来检查我们新建的D列的值。如果它是NULL,那么我们将修补我们的未知文本。我很懒,并使用SSIS变量来做到这一点。你想要的表达是

ISNULL([D]) ? @[User::Lookup_Unknown] : [D]

来源查询

SELECT * FROM (VALUES (10), (20), (30), (40))T1(A);

查询查询

我故意排除30值。我还必须填写我的字符串以确保我有空间可以使用我的不匹配文本。我将Derived列设置为Replace'D'

SELECT B, CAST(C AS varchar(50)) AS C FROM (VALUES (10, 'Foo'), (20, 'Bar'), (40, 'Blee'))T2(B,C);

BIML

商业智能标记语言Biml描述了商业智能平台。在这里,我们将用它来描述ETL。 BIDS Helper,是Visual Studio / BIDS / SSDT的免费补充,它解决了许多缺点。在这里,我用它来制作一个你可以在你自己的环境中创建的包,与你所做的相比较。您需要更新那里的第三行,以将Connection Manager指向有效的实例

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