В службах SSIS, Как искать идентификатор для значения, если нет совпадения, вставить значение и вернуть идентификатор - PullRequest
1 голос
/ 06 ноября 2019

С помощью SSIS я загружаю поэтапный экстракт в основную базу данных. Часть процесса использует LOOKUP для получения идентификатора строкового значения, и, если он не существует, вставьте его в справочную таблицу (с OLE DB COMMAND) и верните этот идентификатор посредством последующего поиска.

*SSIS Screenshot*

LOOKUP сообщает, что нет совпадения для первых ~ 50 значений даже после вставки. Есть ли способ, которым я могу это исправить? Или есть другой подход, который я должен попробовать?

Некоторые исследования / попытки ...

  1. Первоначально совпадений не возвращалось. Мне пришлось изменить все поиски на «Без кеша», чтобы перезагрузить справочную таблицу (они очень маленькие, поэтому я сомневаюсь, что у меня будут большие проблемы с производительностью).

  2. AnВ качестве альтернативы я видел многоадресную рассылку в разные поиски (на основе столбцов, которые я ищу), и объединение объединяет их после того, как я успешно вставил / просмотрел их. Но из того, что я прочитал, при таком подходе возникают серьезные проблемы с производительностью.

Я ожидаю, что поиск будет совпадать или не совпадать. Если не совпадает, введите новое значение;затем снова ищите значение для идентификатора (если нет совпадения, произойдет сбой). Объединение как оригинала, так и оригинала, не подходящего для следующего поиска.

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Поток данных SSIS

Вот окончательная модель потока данных SSIS ... В соответствии с предложением @KeithL, я добавил сортировки до объединения слияния.

Компонент сценария

using System;
using System.Data;
using System.Data.SqlClient;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

public class ScriptMain : UserComponent
{
    IDTSConnectionManager100 serverConMgr;

    public override void PreExecute()
    {
        base.PreExecute();
        serverConMgr = this.Connections.Connection;
    }
    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        using (SqlConnection serverCon = new SqlConnection(serverConMgr.ConnectionString))
        {
            SqlCommand sql = new SqlCommand(
            "INSERT INTO DIM.CONTRIBUTOR (CONTRIBUTOR) VALUES ('" + Row.CONTRIBUTOR + "') " +
            "\n SELECT CAST(SCOPE_IDENTITY() AS INT) AS 'ID'"
            , serverCon);

            serverCon.Open();

            SqlDataReader data = sql.ExecuteReader();

            while (data.Read())
            {
                Row.CONTRIBUTORID = data.GetInt32(0);
            }

            data.Close();
        }

    }
}

"Компонент скрипта" - самая сложная часть. Он вставляет новое значение и получает соответствующий идентификатор. Ниже приведен код этого сценария.

Обратите внимание на 3 важных момента ...

  1. Диспетчер соединений с базой данных (в данном случае с именем «Соединение» ДОЛЖЕН быть соединением ADO.Net)
  2. Row.CONTRIBUTOR_ID - это строка, которую я вручную сконфигурировал как вывод в разделе «Входы и выходы» редактора сценариев
  3. Метод «GetInt32 ()» для SqlDataReader не работает с SCOPE_IDENTITY, если толькоSCOPE_IDENTITY явно приводится как int в команде sql

Вот некоторые другие примечания, относящиеся к сценарию ...

  1. Вы МОЖЕТЕ вставить и вернуть SCOPE_IDENTITY черезКоманда OLE DB , но она довольно сложная
  2. Здесь приведена ссылка на документ Microsoft о том, как получить данные с помощью SqlDataReader
1 голос
/ 06 ноября 2019

Попробуйте этот шаблон:

enter image description here

1.You are multicasting the dataset and grouping by just your lookup column
2.inserting your lookup and adding the scopeidentity(lookupid) to you grouped data
3.joining in the data you inserted to effective add your lookup value to every row
4.unioning your data back in

Я не уверен, но вам может потребоваться добавить сортировки, чтобы использовать объединение слиянием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...