2016-06-27 2 views
1

Я пытаюсь выполнить несколько пакетов динамически.Динамическое выполнение нескольких пакетов с использованием задачи выполнения пакета в SSIS

У меня есть таблица в базе данных, которая хранит имена пакетов и имеет индикатор для каждого, как «Y/N». Моя конечная цель - выполнить те, у которых есть индикатор «Y».

Я создаю переменную, которая принимает все имена пакетов под индикатором «Y».

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

Есть ли способ использования выражения свойства в задаче пакета Execute, к которому я могу назначить имена пакетов через переменную и динамически выполнять необходимые пакеты (дочерние пакеты) в том же решении?

ответ

0

Да - я подошел к вопросу иначе. Это вызовет задание агента SQL - имя задания передается как переменная - это будет заполнено вашим FOR ... LOOP.

  • Работа выполнена
  • Мы контролируем sysjobactivity, чтобы обнаружить, когда он на самом деле работает, и когда он закончил.
  • После того, как он закончен, мы ищем самую последнюю запись в sysjobhistory, чтобы узнать, что такое статус (запись записывается в эту таблицу только после того, как выполнение остановлено - если мы сразу проверим, мы получим последний известный статус)

Для того, чтобы это сработало, вы должны быть уверены, что вы единственный пользователь, который может выполнять эту работу, иначе вы могли бы получить чужую историю!

Для пользователя, выполняющего задание, требуется SQLAGENTOPERATORROLE в MSDB.

SET NOCOUNT ON; 

DECLARE @job_name VARCHAR(100) = 'YOU_JOB_NAME_HERE' 
EXEC msdb.dbo.sp_start_job @job_name = @job_name 

WHILE EXISTS(
    SELECT 1 FROM msdb.dbo.sysjobs_view job 
    INNER JOIN msdb.dbo.sysjobactivity activity ON job.job_id = activity.job_id 
    INNER JOIN msdb.dbo.syssessions sess ON sess.session_id = activity.session_id 
    INNER JOIN (SELECT MAX(agent_start_date) AS max_agent_start_date FROM msdb.dbo.syssessions) sess_max ON sess.agent_start_date = sess_max.max_agent_start_date 
    WHERE job.name = @job_name AND run_requested_date IS NOT NULL AND stop_execution_date IS NULL 
) 
BEGIN 
    PRINT 'Running' 
    WAITFOR DELAY '00:00:01' 
END 
PRINT 'Finished' 

SELECT TOP 1 HIST.run_status 
    -- 0=Failed, 1=Succeeded 2=Retry 3=Cancelled 
FROM msdb.dbo.sysjobs JOB 
INNER JOIN msdb.dbo.sysjobhistory HIST ON HIST.job_id = JOB.job_id 
WHERE JOB.name = @job_name 
ORDER BY HIST.run_date, HIST.run_time 
1

Ваш подход правильный и требует небольшой настройки.
ExecutePackage Task имеет свойство PackageName, который содержит полный путь к пакету. В случае каталогов SSISDB это просто имя пакета, когда вы вызываете пакет из своего проекта. Если пакеты хранятся в MSDB, то это «\\ Folder1 \\ Folder2 \\ Packagename». Вы можете установить PackageName Свойство, которое вам нравится с помощью выражений (т. Е. Путь пакета префикса, если необходимо).
Малый пример enter image description here

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

  • Нет связанных вопросов^_^