SSIS избегает изменения выражения производного столбца вручную

У меня есть пакет SSIS, который нужно запускать каждый первый день недели, источник - из файла Excel, а местом назначения - таблица SQL.

Текущий процесс заключается в замене нулевого значения на 0 в файле Excel вручную (это занимает много времени), поэтому я создал пакет и в настоящее время работаю с производным выражением столбца "(Column1 ==" "? 0: Column1) ", но столбцы файла Excel не всегда совпадают с выражением производного столбца, поэтому каждый раз, когда мне нужно запускать пакет, мне также приходится редактировать выражение производного столбца. Я ищу лучший способ сделать это и не делать это вручную. Заранее спасибо.


person r-r    schedule 15.10.2015    source источник
comment
Если я правильно понимаю, на одной неделе производный столбец может быть основан на Column1, а на следующей неделе это может быть Column2, Column3 или другой столбец? Если это так, как узнать, какой столбец применять от одной недели к следующей? Чем отличается этот столбец от других на исходном листе Excel?   -  person user3662215    schedule 15.10.2015
comment
Я отредактировал свой комментарий. Столбцы excel содержат даты прошлой недели, поэтому Column1 - это дата понедельника (20151005), Column2 (20151006) и так далее ... Затем в целевой таблице столбцы: понедельник, вторник, до пятницы.   -  person r-r    schedule 15.10.2015
comment
Извините, я не вижу дополнительной информации. Кроме того, вам нужно вручную открывать задачу производного столбца каждую неделю, чтобы изменить источник столбца?   -  person user3662215    schedule 15.10.2015
comment
Рабочий лист содержит столбцы для каждого рабочего дня недели (с понедельника по пятницу) с столбцом 1 = понедельник, столбец 2 = вторник, столбец 3 = среда, столбец 4 = четверг и столбец 5 = пятница. Каждый столбец содержит дату этого дня предыдущей недели. Учитывая это, какое правило вы применяете, чтобы определить, какой из пяти использовать для производного столбца?   -  person user3662215    schedule 15.10.2015
comment
да, это текущий сценарий на данный момент, каждый раз, когда мне нужно изменить источник, я также должен изменить выражение столбца извлечения   -  person r-r    schedule 15.10.2015
comment
Теперь я понимаю источник Excel. Но почему вам нужно каждую неделю изменять источник производного столбца в выражении, чтобы он указывал на другой столбец?   -  person user3662215    schedule 15.10.2015
comment
Вот пример выражения производного столбца [20151005] ==? 0: [20151005] Имена столбцов - это даты, а не имена дат, поэтому мне приходится менять их вручную.   -  person r-r    schedule 15.10.2015
comment
Насколько гибок ваш исходный код Excel? Вы можете использовать статическое имя столбца (понедельник, вторник и т. Д.), А затем вывести свои фактические даты. Таким образом у вас будет что-то вроде [Monday] == "" ? 0 : [Monday]   -  person sorrell    schedule 15.10.2015
comment
Хорошо, теперь я понимаю. Поскольку дата, скажем, понедельника, меняется с одной недели на другую, заголовок столбца также изменяется. Например, заголовок первого столбца на прошлой неделе был 20151005, а за неделю до этого - 20150928. Причина, по которой это привлекло мое внимание, заключается в том, что я недавно создал пакет SSIS, который динамически считывает множество файлов Excel, содержащих один или несколько листов с каждым из них. лист, содержащий разные заголовки столбцов. Затем каждый рабочий лист стал отдельной таблицей в базе данных. В любом случае, я думаю, что смогу помочь, и это не будет слишком сложно.   -  person user3662215    schedule 15.10.2015
comment
Еще один вопрос. Меняется ли имя файла Excel?   -  person user3662215    schedule 15.10.2015
comment
Пропустить заголовки столбцов вариант? Столбец1 всегда понедельник, независимо от значения в строке 1?   -  person billinkc    schedule 15.10.2015
comment
Может ли человек, создающий файл Excel каждую неделю, просто назвать первый столбец Monday вместо, например, 20151005, или это то, что вы не можете контролировать?   -  person user3662215    schedule 16.10.2015


Ответы (2)


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

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

Google BiML Tutorial, чтобы начать изучать BiML, и удачи.

person Tab Alleman    schedule 15.10.2015

Если невозможно сделать так, чтобы человек, создающий файл Excel каждую неделю, называл пять столбцов «Понедельник», «Вторник», «Среда», «Четверг» и «Пятница» вместо «20151005», «20151006», «20151007», «20151008» и «20151009» (например, то, что было применено на прошлой неделе), то это можно сделать с помощью следующих шагов.

Шаги:

  1. Создайте новую глобальную пользовательскую переменную типа string в вашем пакете SSIS и назовите ее как-то вроде «День».
  2. В производном выражении столбца замените, например, «20151005» новой пользовательской переменной. Вы можете перетащить его сверху вниз, и он будет выглядеть примерно как @ [user :: Day].
  3. Теперь, чтобы динамически заполнить эту новую переменную «День», добавьте сценарий SQL, который запускает следующий SQL с ResultSet из единственной строки. В набор результатов слева добавьте пользовательскую переменную «День» в столбце «Имя переменной». Присвойте имени результата значение «0». В разделе «Общие» установите для параметра «Тип источника» значение «Прямой ввод» и укажите следующий код SQL, который вернет значение даты понедельника предыдущей недели в формате ггггммдд.

    declare @date as datetime 
    set @date = dateadd(week, datediff(week, 0, getdate()-7), 0) 
    select cast(year(@date) as char(4)) + right('00' + convert(varchar(2), month(@date)), 2) + right('00' + convert(varchar(2), day(@date)), 2)
    

Ключевым моментом здесь является то, что вы можете запустить пакет SSIS в любой день следующей недели, и он будет собирать эту информацию за понедельник предыдущей недели. Но если вы пропустите неделю, он будет искать столбец, которого больше нет. Альтернативой применению сценария SQL для захвата даты понедельника на предыдущей неделе является прямое считывание первого столбца с рабочего листа, и это становится сложным, поскольку вместо этого используется задача сценария с использованием Visual Basic или C # ... Ссылки Excel. Гораздо сложнее, но это можно сделать.

Надеюсь это поможет.

person user3662215    schedule 15.10.2015
comment
Но где я должен разместить SQL-скрипт? - person r-r; 22.10.2015
comment
Скрипт SQL, который заполняет переменную, нужно просто поместить в любом месте перед шагом, на котором та же переменная применяется в производном столбце. - person user3662215; 24.10.2015