#sql-server #database #ssis #etl
#sql-server #База данных #служба ssis #etl
Вопрос:
Я создаю пакет SSIS для импорта данных CSV-файла в таблицу SQL Server. В некоторых строках в файлах CSV будут отсутствовать значения.
Например, если строка имеет формат: value1,value2,value3 и value2 отсутствует, тогда она будет отображаться как: value1,,value3 в файле csv.
Когда в моем пакете служб SSIS происходит вышеуказанное (значение 2 отсутствует), я хочу, чтобы значение NULL попадало в столбец принимающего SQL Server, который будет содержать значение 2.
Я понимаю, что могу добавить задачу «Script» в свой пакет SSIS, чтобы применить это правило. Однако я обеспокоен тем, что это резко снизит производительность моего пакета SSIS. Я не эксперт по внутренней работе SSIS / SQL Server, но я обеспокоен тем, что этот сценарий приведет к тому, что мой скрипт потеряет возможности «МАССОВОЙ ВСТАВКИ» (и другие эффективности), поскольку скрипту придется проверять каждую строку и применять изменения по мере необходимости.
Кто-нибудь может подтвердить, приведет ли добавление такого скрипта к серьезному снижению производительности? Или механизм SSIS / SQL-Server запускает скрипт для каждой строки, а затем выполняет массовую вставку? Есть ли другой способ применить это правило без снижения производительности?
Ответ №1:
Во-первых, вы можете использовать задачу скрипта, когда это необходимо. Задача скрипта будет выполняться только один раз для каждого выполнения всего пакета, а не для каждой строки. Для каждой строки есть другой компонент, называемый компонентом скрипта. Когда других обычных задач SSIS недостаточно для достижения желаемого, вы, безусловно, можете использовать компонент script. Я не считаю, что это убивает производительность, если вы не реализуете ее плохо.
Во-вторых, в этом конкретном требовании вы можете просто использовать Flat File Source task для импорта вашего csv-файла. При отсутствии значения будет присвоено значение NULL. Я считаю, что это допустимое значение csv, и каждая строка имеет правильное количество запятых для каждого поля (общее поле — 1 на самом деле), даже если значение пусто или равно нулю для некоторых полей.