Найдите и замените поле и оставьте вывод "Не доступно" по умолчанию для несопоставленных записей.

Таблица 1 имеет поле "А"

Таблица 2 имеет поля "B" и "C"

Таблица 3 получит вставку полей "A" и "D", причем "D" генерируется из "C", где "A" соответствует "B", или показывает строку "Недоступно" для каждой записи, где "A" не имеет иметь соответствующее поле 'B'.

На самом деле я пытаюсь реплицировать поведение scribe DBLookupDefault в SSIS, но сложно воспроизвести это поведение в одном потоке данных.

1 ответ

Решение

Я бы подошел к этому как Lookup с опцией без совпадения, установленной в Ignore Failure. Если мы сделаем совпадение, мы добавим в столбец C псевдоним D. В противном случае у нас будет NULL.

После поиска мы хотим получить производный столбец, который проверяет значение нашего недавно отчеканенного D-столбца. Если это NULL, тогда мы добавим наш неизвестный текст. Я ленивый и использовал переменную SSIS, чтобы сделать это. Вы хотите выражение

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

Исходный запрос

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

Запрос поиска

Я намеренно исключаю значение 30. Я также должен был заполнить мою строку, чтобы у меня было место для моего несоответствующего текста. Я установил производный столбец как Заменить 'D'

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

BIML

Biml, язык разметки Business Intelligence, описывает платформу для бизнес-аналитики. Здесь мы собираемся использовать его для описания 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>
Другие вопросы по тегам