powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SSIS ограничить итерации цикла по времени выполнения
17 сообщений из 17, страница 1 из 1
SSIS ограничить итерации цикла по времени выполнения
    #39611799
IDVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет. Подскажите пожалуйста.

Есть пакет, в одном цикле выполняется множество действий над данными (Извлечение, трансформация и вставка данных). Мне необходимо ограничить выполнение каждой итерации по времени, т.е. если итерация цикла превысила определенное значение в секундах, то необходимо прервать выполнение и перейти к следующему шагу цикла.

Пытался сделать это имитируя ошибку в компоненте SriptTask, итерация останавливается только после завершения выполнения любого контейнера (если он запустился до фиксации исключения в SriptTask), я не знаю, как мне прервать все активные действия принудительно. Остается только перечислить их в том же SriptTask и проверять на активность, если активен, то принудительно останавливать. Может есть более правильное решение?
...
Рейтинг: 0 / 0
SSIS ограничить итерации цикла по времени выполнения
    #39611849
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVTПытался сделать это имитируя ошибку в компоненте SriptTask
There are limitations in using the Script Task having no control over other tasks after its execution turn
Периодически всплывает такая задача. Пока общепринятая придумка только вторым sql agent job контролировать время первого agent job с пакетом SSIS внутри и гасить по превышению лимита.
Заказ в Редмонд для лимита времени вроде как есть, но воз и ныне там .
...
Рейтинг: 0 / 0
SSIS ограничить итерации цикла по времени выполнения
    #39611863
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAPЗаказ в Редмонд для лимита времени вроде как есть, но воз и ныне там .Не, заказа нет.
Из Редмонда пишут в этих обсуждениях: "если надо - заказывайте в коннекте". Видимо, никто не заказал.
...
Рейтинг: 0 / 0
SSIS ограничить итерации цикла по времени выполнения
    #39611870
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgAndy_OLAPЗаказ в Редмонд для лимита времени вроде как есть, но воз и ныне там .Не, заказа нет.
Из Редмонда пишут в этих обсуждениях: "если надо - заказывайте в коннекте". Видимо, никто не заказал.
Я отвлекся на проблему прикручивания нового движка в postgresql и перестал пинать этих ленивых индусов. Спасибо за информацию.
...
Рейтинг: 0 / 0
SSIS ограничить итерации цикла по времени выполнения
    #39611875
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVT,

отказаться от цикла в ссис и перейти на внешний
далее как вам уже посоветовали гасить пакет и стартовать новый
...
Рейтинг: 0 / 0
SSIS ограничить итерации цикла по времени выполнения
    #39611877
IDVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так в том и дело, тушить джоб не есть решение, жаль что выхода нет.... Значит буду колхозить =(
...
Рейтинг: 0 / 0
SSIS ограничить итерации цикла по времени выполнения
    #39611921
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
используем самописаное веб-приложение, которое стартует SSIS-пакеты, и убивает их после превышения заданного в приложении времени выполнения
...
Рейтинг: 0 / 0
SSIS ограничить итерации цикла по времени выполнения
    #39611950
Фотография StarikNavy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>которое стартует SSIS-пакеты, и убивает их после
аналогично, но просто соседним джобом, который сверяет время работы основного джоба, с опорной таблицей, где прописаны ограничения
...
Рейтинг: 0 / 0
SSIS ограничить итерации цикла по времени выполнения
    #39611995
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVTВсем привет. Подскажите пожалуйста.

Есть пакет, в одном цикле выполняется множество действий над данными (Извлечение, трансформация и вставка данных). Мне необходимо ограничить выполнение каждой итерации по времени, т.е. если итерация цикла превысила определенное значение в секундах, то необходимо прервать выполнение и перейти к следующему шагу цикла.

Пытался сделать это имитируя ошибку в компоненте SriptTask, итерация останавливается только после завершения выполнения любого контейнера (если он запустился до фиксации исключения в SriptTask), я не знаю, как мне прервать все активные действия принудительно. Остается только перечислить их в том же SriptTask и проверять на активность, если активен, то принудительно останавливать. Может есть более правильное решение?
Запилил себе такое решение.
А именно - таймер в работающем script task, который принудительно гасит соединение с источником данных.
...
Рейтинг: 0 / 0
SSIS ограничить итерации цикла по времени выполнения
    #39613373
IDVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то я совсем потерялся и запутался, выручайте .....

Смысл таков: Родительский пакет, запускает N'ое количество дочерних пакетов, (работаю на прямую с файлов DTSX). Добавил счетчик, по достижению которого, мне необходимо убить поток, не дожидаясь его завершения.

Функция загрузки файла DTSX дочернего пакета

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
        static void RunPackage( int NumFlowsExecute
                              , int NumRepetition
                              , int NumSession
                              , object SourceDataList
                              , string DTSXPackage
                              , string StageDBName
                              , string DWHDBName
                              , ref Boolean ExceptionFlow)
        {
            Application app = new Application();
            Package pkg = app.LoadPackage(DTSXPackage, null);
            Variables vars = pkg.Variables;
                      vars["User::NumFlowsExecute"].Value = NumFlowsExecute;
                      vars["User::SourceDataList"].Value = SourceDataList;
                      vars["User::NumRepetition"].Value = NumRepetition;
                      vars["User::NumSession"].Value = NumSession;
                      vars["User::StageDBName"].Value = StageDBName;
                      vars["User::DWHDBName"].Value = DWHDBName;
             pkg.Execute(null, vars, null, null, null);

            if (pkg.ExecutionResult.ToString() == "Failure")
            {
                ExceptionFlow = true;
            }
        }



Формирование задач (потоки)

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
var TasksFlow = new List<Thread>();      
.
.
.
                for (int i = 0; i < CountRunFlow; i++)
                {
                    int NumFlowsExecute = i + 1;
                    var Thread = new Thread(() => RunPackage(NumFlowsExecute
                                                           , NumRepetition
                                                           , NumSession
                                                           , DTableList
                                                           , DTSXPackage
                                                           , StageDBName
                                                           , DWHDBName
                                                           , ref ExceptionFlow));
                    Thread.Start();
                    TasksFlow.Add(Thread);
                }



проверка на завершение потоков, тут вызываю метод Abort() каждому активному патоку, т.е. не завершенному, срок выполнения которых превысил допустимый (переменная TimeOutDTSXPackage)

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
            while( TasksFlow.Any(t => t.ThreadState == System.Threading.ThreadState.Running))
            {
                CounterSec ++;

                // поток(и) выполняется дольше допустимого времени (сек)
                if( CounterSec > TimeOutDTSXPackage) 
                  {
                   
                    for ( int i = 0; i < CountRunFlow; i ++)
                       {
                         var CurrentThread = TasksFlow.ElementAt(i);
                         // проверка состояния потока
                         if( CurrentThread.ThreadState == System.Threading.ThreadState.Running)
                           {
                             CurrentThread.Abort(); //если активен, то завершаем поток
                           }
                       }
                  }
                Thread.Sleep(1000);
            }

            Dts.Variables["User::ExceptionFlow"].Value = ExceptionFlow;
            Dts.TaskResult = (int)ScriptResults.Success;



Скрипт, по заданному условию замечательно выходит из цикла, вся дальнейшая логика работает, НО метод Abort() на самом деле не завершает дочерний пакет. Наверняка я криво описал логику его завершения, нет навыков работы с C#, тем более с потоками. Помогите пожалуйста убить все не завершенные потоки в списке "TasksFlow".

Методы решения с Джобом мне не совсем подходит, т.к. количество потоков задается переменной, сегодня 2, завтра 14 и т.д.
...
Рейтинг: 0 / 0
SSIS ограничить итерации цикла по времени выполнения
    #39613398
ryukl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
SSIS ограничить итерации цикла по времени выполнения
    #39613440
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVTЧто-то я совсем потерялся и запутался, выручайте .....
Могу ошибиться, но, во-первых, вы завершаете не выполнение пакета, а локальный поток, запустивший пакет на сервере. Во-вторых, выполняемый пакет нельзя завершить принудительно - можно лишь вежливо попросить его завершиться (это не джоба).
Именно по этой причине для принудительного останова пакета я и рвал его соединение с источником.
...
Рейтинг: 0 / 0
SSIS ограничить итерации цикла по времени выполнения
    #39613467
Ferdipux
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IDVT,

А у вас SSIS версии 2008 или 2012+? Если 2012+ и пакеты в режиме SSIS Catalog - их можно запускать асинхронно, получая назад код исполнения. Далее - периодически проверять статус определенного экземпляра исполнения. Если необходимо - исполнение можно прибить.

Пример - см http://muxtonmumbles.blogspot.ru/2012/08/programmatically-executing-packages-in.html
Подробная информация о namespace - https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.integrationservices.aspx

Если же у вас SSIS 2008 - то через jobs, если динамически - можно создать job и затем его прибить.
...
Рейтинг: 0 / 0
SSIS ограничить итерации цикла по времени выполнения
    #39613476
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVT,
Этот метод должен без проблем решить поставленную задачу. Thread.Join Method (TimeSpan)

https://msdn.microsoft.com/en-us/library/23f7b1ct(v=vs.110).aspx
...
Рейтинг: 0 / 0
SSIS ограничить итерации цикла по времени выполнения
    #39613497
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FerdipuxIDVT,

А у вас SSIS версии 2008 или 2012+? Если 2012+ и пакеты в режиме SSIS Catalog - их можно запускать асинхронно, получая назад код исполнения.
Добавлю, что дефолтно они как раз асинхронно и запускаются.
И нужно для синхронности делать нечто подобное:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
	declare @execution_id bigint
 	exec [SSISDB].[catalog].[create_execution] 
		@folder_name = N'folder1'
		,@project_name = N'project1'
		,@package_name = package1.dtsx'
		,@execution_id = @execution_id output
	exec [SSISDB].[catalog].[set_execution_parameter_value]
		@execution_id,  
		@object_type=50, 
		@parameter_name=N'SYNCHRONIZED', 
		@parameter_value=1; -- true
	exec [SSISDB].[catalog].[start_execution] @execution_id
	set @output_execution_id = @execution_id
...
Рейтинг: 0 / 0
SSIS ограничить итерации цикла по времени выполнения
    #39613498
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAP,

Так красивее:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
declare @execution_id bigint
 	exec [SSISDB].[catalog].[create_execution] 
		@folder_name = N'folder1'
		,@project_name = N'project1'
		,@package_name = N'package1.dtsx'
		,@execution_id = @execution_id output
	exec [SSISDB].[catalog].[set_execution_parameter_value]
		@execution_id,  
		@object_type=50, 
		@parameter_name=N'SYNCHRONIZED', 
		@parameter_value=1; -- true
	exec [SSISDB].[catalog].[start_execution] @execution_id
	set @output_execution_id = @execution_id
...
Рейтинг: 0 / 0
SSIS ограничить итерации цикла по времени выполнения
    #39613518
IDVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Версия сервера 2016, полностью позволяет уйти от листинга под 2008 версию, но переписывать достаточно много, пока нет на это время. Поэтому, большинство предложенных решений не совместимо с текущим проектом, сейчас дочерний пакет даже не развернут на сервер, загружается из локальной директории. Но все это перепишу в ближайшее время, а решение требуется сейчас.

a_voroninIDVT,
Этот метод должен без проблем решить поставленную задачу. Thread.Join Method (TimeSpan)

https://msdn.microsoft.com/en-us/library/23f7b1ct(v=vs.110).aspx

Спасибо, попробую. Но не совсем понимаю полезности, мне необходимо грубо завершить дочерний пакет, в данном примере проверка на его завершение. С этим отлично справляется метод List.Any(t => t.ThreadState == System.Threading.ThreadState.Running)
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SSIS ограничить итерации цикла по времени выполнения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]