Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как немедленно остановить выполнение пакета SSIS?  [new]
Bonnet
Member

Откуда:
Сообщений: 21
Доброго всем дня.

В пакете следующая последовательность

SQL Task 1 ---> Data Flow Task
---> SQL Task 2


Т.е. после SQL Task 1 по успеху параллельно запускается Data Flow Task и SQL Task 2. В Data Flow Task перекачиваются сотни тысяч строк и выполняется он долго. SQL Task 2 - быстрый и если он зафейлился то ждать окончания Data Flow Task смысла нет. Но происходит так: SQL Task 2 - вылетает с ошибкой и весь как пакет вылетает с ошибкой только после того как окончиться Data Flow Task. Как поменяться поведение что бы как только есть ошибка SQL Task 2 валился весь пакет и немедленно. SQL Task 2.FailPackageOnFailure стоит в True.

Спасибо.
20 окт 14, 23:23    [16733817]     Ответить | Цитировать Сообщить модератору
 Re: Как немедленно остановить выполнение пакета SSIS?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
заменить параллельное выполнение на последовательное
21 окт 14, 10:40    [16734870]     Ответить | Цитировать Сообщить модератору
 Re: Как немедленно остановить выполнение пакета SSIS?  [new]
msLex
Member

Откуда:
Сообщений: 8192
Bonnet
Доброго всем дня.

В пакете следующая последовательность

SQL Task 1 ---> Data Flow Task
---> SQL Task 2


Т.е. после SQL Task 1 по успеху параллельно запускается Data Flow Task и SQL Task 2. В Data Flow Task перекачиваются сотни тысяч строк и выполняется он долго. SQL Task 2 - быстрый и если он зафейлился то ждать окончания Data Flow Task смысла нет. Но происходит так: SQL Task 2 - вылетает с ошибкой и весь как пакет вылетает с ошибкой только после того как окончиться Data Flow Task. Как поменяться поведение что бы как только есть ошибка SQL Task 2 валился весь пакет и немедленно. SQL Task 2.FailPackageOnFailure стоит в True.

Спасибо.

т.е. у вас по факту Data Flow Task зависит от SQL Task 2, ну так и поставьте их в нужном порядке:
SQL Task 1 ---> SQL Task 2 ---> Data Flow Task
21 окт 14, 10:53    [16734977]     Ответить | Цитировать Сообщить модератору
 Re: Как немедленно остановить выполнение пакета SSIS?  [new]
Bonnet
Member

Откуда:
Сообщений: 21
Вопрос именно как повалить пакет сразу и не дожидаться завершения Data Flow Task.
Ещё таким образом я хочу контролировать время выполнения пакета. В SQL Task 2, например, скрипт который ждёт 20 минут и проверяет все ли записи перекачались Data Flow, если да - просто выходим, нет - генерим ошибку.
21 окт 14, 13:07    [16736162]     Ответить | Цитировать Сообщить модератору
 Re: Как немедленно остановить выполнение пакета SSIS?  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Bonnet,



в быстром шаге обернуть обработку в try / catch - и в catch`e выполнять процедуру sp_stop_job

подробнее о sp_stop_job тут
http://msdn.microsoft.com/ru-ru/library/ms182793.aspx
21 окт 14, 14:06    [16736699]     Ответить | Цитировать Сообщить модератору
 Re: Как немедленно остановить выполнение пакета SSIS?  [new]
Jovanny
Member

Откуда:
Сообщений: 1195
Jaffar
в быстром шаге обернуть обработку в try / catch - и в catch`e выполнять процедуру sp_stop_job

А если пакет не в джобе выполняется?
21 окт 14, 14:20    [16736824]     Ответить | Цитировать Сообщить модератору
 Re: Как немедленно остановить выполнение пакета SSIS?  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2995
Bonnet, один из тупых вариантов:
1. создаем переменную типа целое со значением "1"
2. после SQL Task 2 по ошибке ставим скрипт компонент в котором созданной переменной присваиваем значение "0"
3. в датафлоу добавляем "деривед колумн" в котором создаем новое поле со значением 1/"наша переменная"

смысл в следующем, что если этой переменной будет присвоено значение 0, то "деривед колумн" отвалится и убьет датафлоу

далее, надо выставить DefaultBuffermaxRows, т.к эта наша переменная будет браться в момент получения новой порции данных
21 окт 14, 17:01    [16738570]     Ответить | Цитировать Сообщить модератору
 Re: Как немедленно остановить выполнение пакета SSIS?  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2995
HandKot, не что-то наврал. Сделал тестовый пакет...не пашет
21 окт 14, 17:04    [16738597]     Ответить | Цитировать Сообщить модератору
 Re: Как немедленно остановить выполнение пакета SSIS?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Есть идея

В событии OnError первого DataFlow запишите флаг в какую-нибудь переменную

В событии OnProgress второго DataFlow проверяйте этот флаг и есть он выставлен, то инициируйте ошибку

Dts.Events.FireError(0, "Another Dataflow failed", "Stopping.", String.Empty, 0);
21 окт 14, 17:13    [16738692]     Ответить | Цитировать Сообщить модератору
 Re: Как немедленно остановить выполнение пакета SSIS?  [new]
Bonnet
Member

Откуда:
Сообщений: 21
a_voronin, Спасибо. Ваш способ работает, но всё же валит пакет не сразу а всё таки ждёт завершения таски в обработчике которой OnProgress стоит генератор ошибки. Все опробованые способы "завалить" немедленно пакет изнутри - не работают. Решил проблему на уровней джобов SQL Agent.

Пакет запускается джобом, который в свою очередь запускается другим джобом и наблюдает за "запускаемым" - если через рез время запускаемые ещё бежит то останавливает его. Вот так.
29 окт 14, 18:39    [16774578]     Ответить | Цитировать Сообщить модератору
 Re: Как немедленно остановить выполнение пакета SSIS?  [new]
Павел-П
Member

Откуда:
Сообщений: 234
Bonnet,

Надо валить процесс, который контролирует запуск пакета физически.
29 окт 14, 20:19    [16774832]     Ответить | Цитировать Сообщить модератору
 Re: Как немедленно остановить выполнение пакета SSIS?  [new]
Bonnet
Member

Откуда:
Сообщений: 21
Павел-П, так и сделал. Пока полёт нормальный.
29 окт 14, 23:20    [16775288]     Ответить | Цитировать Сообщить модератору
 Re: Как немедленно остановить выполнение пакета SSIS?  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2995
Bonnet
a_voronin, Спасибо. Ваш способ работает, но всё же валит пакет не сразу а всё таки ждёт завершения таски в обработчике которой OnProgress стоит генератор ошибки. Все опробованые способы "завалить" немедленно пакет изнутри - не работают. Решил проблему на уровней джобов SQL Agent.

Пакет запускается джобом, который в свою очередь запускается другим джобом и наблюдает за "запускаемым" - если через рез время запускаемые ещё бежит то останавливает его. Вот так.

действительно, генерирование ошибки внутри датафлоу успеха не дают. Но если на ветку с ошибкой вкорячить скрипттаск со следующим кодом
            Microsoft.SqlServer.Dts.Runtime.Application app = new Microsoft.SqlServer.Dts.Runtime.Application();
            RunningPackages pkgs = app.GetRunningPackages(Environment.MachineName);

            foreach(RunningPackage package in pkgs)
            {

                if (Dts.Variables[@"System::ExecutionInstanceGUID"].Value.ToString().ToUpper().Contains(package.InstanceID.ToString().ToUpper())) 
                {
                    package.Stop();
                }
            };

            Dts.TaskResult = (int)ScriptResults.Success;


то вроде как решает заявленную проблему
6 ноя 14, 10:09    [16804608]     Ответить | Цитировать Сообщить модератору
 Re: Как немедленно остановить выполнение пакета SSIS?  [new]
Bonnet
Member

Откуда:
Сообщений: 21
Спасибо. Поэксперементирую позже. Способ, который я описал, пока работает отлично.
28 ноя 14, 21:21    [16922058]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить