SSIS заполняет нулевое значение ненулевым значением

В настоящее время я могу получить этот тип вывода из плоского файла после запуска компонента скрипта в SSIS:

Текущий вывод

Моя цель - заполнить остальную часть столбца тем же серийным номером, например:

Цель Результат

Я попытался сделать это, установив для нее переменную и используя производный столбец, но переменная не устанавливается до окончания потока данных. Кроме того, сценарий читается только построчно, поэтому я не вижу очевидного способа выполнить эту простую задачу.

Есть ли способ создать столбец в сценарии и присвоить ему значение серийного номера по умолчанию? Или есть способ использовать команду SQL для обновления нулевых значений, где столбец не нулевой?


person AlanPear    schedule 07.02.2018    source источник
comment
Конечно. Вы используете оператор обновления. Update YourTable Set SerialNumber = независимо от того, где SerialNumber IS NULL. Но из того, что вы опубликовали, они не выглядят как NULL, они выглядят как пустые строки.   -  person Sean Lange    schedule 07.02.2018
comment
@SeanLange При использовании SSIS и драйверов ACE/JET пустые ячейки будут импортированы как NULL, а не ''. Лично для OP, если вы можете определить порядок данных после импорта, я бы вместо этого сделал это в вашей промежуточной таблице. это намного проще, чем выполнение задачи Script. Намного проще.   -  person Larnu    schedule 07.02.2018
comment
Это до того, как я вставлю его в таблицу. Это просто вывод того, что мой скрипт может генерировать из текстового файла. Также они пусты, потому что я сделал пример в Excel.   -  person AlanPear    schedule 07.02.2018
comment
Не вижу ваших изображений, но, возможно, сделайте другую таблицу. Импортируйте в таблицу 1, обновите серийный номер, а затем продолжите следующие шаги, используя эту промежуточную таблицу в качестве источника.   -  person Jacob H    schedule 07.02.2018
comment
Я мог бы сделать промежуточную таблицу с триггером. Моя единственная проблема в том, что у меня есть несколько таких файлов, а уникальный идентификатор — это серийный номер. Поэтому я не могу присоединиться к вставленной псевдотаблице, чтобы убедиться, что я обновляю только только что импортированные значения.   -  person AlanPear    schedule 07.02.2018
comment
По опыту, при импорте данных из SSIS или любого процесса ETL хорошей идеей является загрузка сначала в промежуточную таблицу. В этом нет ничего плохого, и есть некоторые вещи, которые гораздо легче сделать на разных этапах. Нередки случаи, когда процесс ETL на самом деле является процессом ELT, и вам не следует бояться изменить порядок действий для достижения конечной цели.   -  person Larnu    schedule 07.02.2018
comment
Спасибо за совет. Все еще новичок в игре, и я решил свести к минимуму как можно больше столов.   -  person AlanPear    schedule 07.02.2018
comment
Я не вижу изображения, но чтобы изменить нулевое значение на значение, я бы просто использовал производный столбец. ISNULL (Тестовая_колонка)? Null_Value : Test_Column   -  person KeithL    schedule 07.02.2018
comment
Как 123 выбрано в качестве значения по умолчанию?   -  person KeithL    schedule 08.02.2018


Ответы (2)


Вы можете попробовать этот дизайн, чтобы выполнить то, что вам нужно (не стесняйтесь упростить его, протестировано с вашими входными данными): введите здесь описание изображения

  1. Прочитай свой источник
  2. Мультикаст
  3. Совокупность по столбцу, в котором вы хотите получить максимальное значение (серийный номер)
  4. создать производный столбец с постоянным значением (например, 1)
  5. отсортировать набор по постоянному значению
  6. Объедините два набора с полным соединением, используя постоянный ключ
  7. импортировать данные в целевую таблицу и использовать новый агрегированный столбец для заполнения столбца серийного номера
person Kobi    schedule 07.02.2018

Оператор обновления после загрузки данных в таблицу:

update table set column = (select top 1 column from table where column is not null) where column is null
person user4219031    schedule 07.02.2018
comment
Я бы посоветовал предостеречься от этого. Похоже, что ОП подразумевает, что они загружают данные в таблицу, которая может уже содержать данные (или иметь несколько наборов). выполнение этого метода будет UPDATE каждого значения NULL с случайным (у вас нет ORDER BY в вашем подзапросе, использующем TOP 1) не-*NULL* значением тот самый столбец. Это может сделать данные очень неправильными. - person Larnu; 07.02.2018
comment
Вот этого я и опасался. Обычно в своих триггерах я использую псевдотаблицу INSERTED, чтобы случайно не испортить хорошие данные. Но поскольку мой серийный номер не указан при вставке, я не могу этого сделать. - person AlanPear; 07.02.2018