SSIS LookUp не имеет дело с NULL, как утверждают в документах. - PullRequest
7 голосов
/ 29 августа 2011

У меня есть поток данных SSIS, который использует поиск.Иногда значение для поиска (в моем потоке, а не в таблице поиска) равно нулю.

Документы MSDN говорят :

рассмотреть возможность использования полногокэширование, которое поддерживает операции поиска с нулевыми значениями.

Я использую полное кэширование (по умолчанию).

Но когда я запускаю, я получаю эту ошибку в моих пустых строках:

Строка не дала совпадений во время поиска

Если я изменил результат, чтобы игнорировать несоответствия, он будет работать нормально.Но это игнорирует все несоответствия.Я просто хочу пропустить нули (как ноль).Любое другое несоответствие должно привести к сбою компонента.

Что я делаю не так?Как я могу получить нулевые значения для записи как нулевые, но не игнорировать любые другие ошибки.

SSISFullCacheScreenshot

SSISErrorScreenshot

(ПРИМЕЧАНИЕ: я дважды проверил мой взгляддо таблицы. В ней ВСЕ значения, которые есть в моей исходной таблице. Просто не имеет значения NULL в качестве значения (потому что странно искать значение для нуля.)

Ответы [ 4 ]

9 голосов
/ 09 января 2015

Я знаю, что это поздний ответ, но для любого, кто искал это, как я, я нашел, что это самый простой ответ:

В поисковом соединении используйте запрос SQL для получения ваших данных и добавьте UNION SELECT NULL, NULL в конец.

Например:

SELECT CarId, CarName FROM Cars 
UNION SELECT NULL, NULL

Предварительный просмотр покажет дополнительную строку CarId = Null и CarName = Null, которая будет доступна в поиске.

4 голосов
/ 30 августа 2011

Я никогда не замечал эту строку в BOL о режиме полного кэширования.Ответом на вашу проблему является то, что вы уже заявили о наличии NULL в ссылочном наборе данных.Быстрым доказательством будут эти два примера потоков данных.

В этом примере я генерирую 4 строки данных: 1, 2, 3 и NULL (Column_isNull = true) и попадаю в таблицу в памяти, в которой есть всезначения и выполнить поиск между столбцом в потоке данных и c1, определенным в таблице в памяти.Он взрывается, как вы описали

Demo data flow with failed null lookup

Затем я добавил еще одно значение в таблицу поиска, NULL и вуаля, поиск в полном кэше способен сопоставить NULL с NULL.

Demo data flow with valid null lookup

Еда на вынос

Чтобы сопоставить входное значение NULL в компоненте поиска, в наборе справочных данных должно быть доступно соответствующее значение NULL, а также кэшрежим установлен на FULL.

1 голос
/ 25 ноября 2011

Чтобы обойти эту проблему в SSIS, существует альтернативный подход к предыдущему SO ответу , который можно применить.

В преобразовании «Уточняющий запрос» вы можете перенаправить строки при ошибке, а затем передать их в другое место назначения, которое может быть просто той же самой таблицей назначения в вашей базе данных.

Поэтому ваша таблица назначения в базе данных будет по-прежнему получать все строки (477 на снимке экрана ниже).

Таким образом, при таком подходе нет необходимости помещать фиктивные значения NULL в таблицу поиска в вашей базе данных, а компромиссы:

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

SSIS Null Values in Lookup

0 голосов
/ 19 января 2013

Вы можете использовать условное разбиение, чтобы разбить данные на два набора: один, где заданное значение равно нулю, а остальные. Выполняйте поиск только для выходных данных, которые имеют ненулевые значения, а затем объедините результаты обратно с набором данных, который содержит нулевые значения, используя Union All. Вы все еще можете отловить несоответствующие значения при поиске и не беспокоиться о необходимости добавить пустую запись в таблицу поиска

...