2015-07-16 1 views
1

В моем пакете SSIS у меня есть поток данных, который выглядит примерно так.Захват времени выполнения для каждой задачи в потоке данных в SSIS2012

enter image description here

Мое требование регистрировать время окончания каждого FlatFile назначения (или время, когда каждый из плоских файлов создается), в таблице SQL сервера. Чтобы быть более ясным, в таблице журнала будет одна строка для каждого файла. Есть ли простой способ (желательно) выполнить это? Заранее спасибо.

Обновление: Я закончил работу с сценарием после потока данных и прочитал время создания каждого файла, созданного в потоке данных. Я также использовал ту же задачу сценария, чтобы вставлять журналы в таблицу, чтобы держать вещи в одном месте. Для получения дополнительной информации см. Сообщение, замаскированное как ответ.

ответ

1

Чтобы получить точную дату и временную метку каждого плоского файла, созданного в качестве адресата, вам необходимо создать три новые глобальные переменные и настроить контейнер для каждого цикла цикла в потоке управления, следующий за текущим потоком данных и затем добавить к контейнеру for-each цикла задачу сценария, которая будет считывать из одного плоского файла за раз информацию о дате/времени. Затем эта информация будет сохранена в одной из новых глобальных переменных, которая затем может быть применена во второй задаче SQL (также в цикле for-each) для записи информации в таблицу базы данных.

Следующая ссылка является хорошим примером шагов, которые вам необходимо применить. Существует несколько дополнительных шагов, которые не могут быть легко исключены.

http://microsoft-ssis.blogspot.com/2011/01/use-filedates-in-ssis.html

Надеется, что это помогает.

+0

Я использовал цикл (C#) в задаче сценария и вставил журналы, получив диспетчер соединений с базой данных. Казалось немного проще. Спасибо за идею и ссылку :) – nlkasyap

1

После более пристального изучения инструментария я считаю, что лучший способ сделать это - переместить каждое соединение источника/назначения в свой собственный поток данных и использовать событие OnPostExecute для каждого потока данных для записи в таблицу SQL.

+1

Я не вижу событие OnCompletion [здесь] (https://msdn.microsoft.com/en-us/library/ ms140223 (v = sql.105) .aspx) Я использовал OnPostExecute. В какой версии SSIS включен OnCompletion? – Beth

+0

OnPostExecute тогда. Я не мог вспомнить точное имя. –

+0

@TabAlleman: Если я не ошибаюсь, обработчик событий доступен только для задач потока управления, а не для отдельных задач в потоке данных. Или я чего-то не хватает? – nlkasyap

1

Хотел предоставить более подробную информацию по подходу @ TabAlleman. Для каждой задачи потока управления с таким именем, как Bene_hic, вы получите исходный файл и файл назначения. На вкладке 'Event Handlers' для этого исполняемого файла (используйте раскрывающийся список) вы можете создать событие OnPostExecute.

В этом случае у меня есть две задачи SQL. Один генерирует SQL для выполнения для этой задачи потока управления, второй выполняет SQL.

Эти задачи SQL зависят от двух пользовательских переменных, помеченных в событии OnPostExecute. Свойству EvaluateAsExpression установлено значение True. Первый из них, Variable1, используется в качестве шаблона для SQL для выполнения и имеет значение, как:

"SELECT execSQL FROM db.Ssis_onPostExecute 
where stgTable = '" + @[System::SourceName] + "'" 

@[System::SourceName] представляет собой систему с переменной SSIS, содержащий имя задачи потока управления.

У меня есть таблица в моей базе данных с именем Ssis_onPostExecute с двумя полями, execSQL поля со значениями, такими как:

 DELETE FROM db.TableStats WHERE TABLENAME = 'Bene_hic'; 
     INSERT INTO db.TableStats 
      SELECT CreatorName ,t.tname, CURRENT_TIMESTAMP ,rcnt FROM 
     (SELECT databasename, TABLENAME AS tname, CreatorName FROM dbc.TablesV) t 
     INNER JOIN 
     (SELECT 'Bene_hic' AS tname, 
COUNT(*) AS rcnt FROM db.Bene_hic) u ON 
      t.tname = u.tname 
    WHERE t.databasename = 'db' AND t.tname = 'Bene_hic'; 

и stgTable поля с именем соответствующей задачи потока управления в пакете (регистру чувствительный!), Как Bene_hic

В первой задаче SQL (названной SQL,) У меня есть SourceVariable набора для переменного пользователя (User::Variable1) и ResultSet имущества установлено в 'single row.' результирующего набора подробно включает в себя Result Name = 0 и Variable name в качестве второго переменная пользователя (User::Variable2.)

Во второй задаче SQL (exec,) у меня есть множество SQLSourceType собственности на Variable и SourceVariable набор свойств для User::Variable2.

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

Кроме того, при отладке вам необходимо запустить весь пакет, а не только одну задачу в событии. В противном случае переменные не будут установлены правильно.

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

-Beth

1

Простое решение будет: 1) перетащить OLE DB Command из панели инструментов после назначения Fatfile. 2) Update Script обновить таблицу current date, когда Flat file назначение успешно. 3) Вы можете создать variable (объем проекта) со значением systemdatetime. 4) Возможно, вам придется создать еще один variable в зависимости от конструкции вашего пакета, если Success или fail

+0

Спасибо за ответ, но ваш ответ не касается моего требования. Ваш подход будет работать, если в потоке данных будет только один плоский файл. Но я хочу зарегистрировать конечное время для КАЖДОГО назначения плоского файла В одном потоке данных. – nlkasyap

+0

Также я посмотрел пакет 2008 R2, и после назначения плоского файла нет продолжения, за исключением неудачных строк. Другими словами, зеленая стрелка не покидает пункт назначения, только красный. –

+0

@nlkasyap: вы можете сделать это, перетаскивая задачу OLE Command и записывая сценарий обновления, который вы выполняете в выполнении задачи SQL или передаете переменную datetime в задаче командной строки OLE. – Maverick

Смежные вопросы