Получить код возврата / выхода из пакета, выполненного из каталога служб SSIS

Я новичок в SSIS/SQL, поэтому следующие ссылки на имена могут быть неправильными, но я надеюсь раскрыть суть проблемы

Инструмент планирования, который я использую, выполняет развернутые пакеты служб SSIS в SQL 2012, и этот инструмент должен указывать, когда пакет служб SSIS дает сбой, а затем останавливать выполнение любых последующих запланированных заданий.

В проекте используется модель развертывания проекта служб SSIS в SQL 2012. Затем развернутые пакеты служб SSIS вызываются сторонним инструментом планирования. В каталоге служб SSIS мы используем параметр "Выполнить", чтобы создать сценарий SQL для передачи планировщику. Этот скрипт редактируется, чтобы добавить параметр, чтобы гарантировать, что задание выполняется SYNSCHRONOUSLY (то есть вызывающая сторона продолжает ждать, пока задание не будет завершено). Сценарий SQL запускается из инструмента планирования и будет перемещаться к следующему заданию только после его завершения.

Проблема заключается в том, что инструмент планирования не получает код возврата при сбое пакета служб SSIS. Если пакет служб SSIS дает сбой, он содержит шаг для сбора и отправки электронного письма с уведомлением об ошибке, поэтому у нас есть представление об ошибках. Однако любые зависимые задания в потоке планирования также выполняются независимо от того, успешно ли выполнено задание или нет. Есть ли параметр для принудительной отправки кода возврата в инструмент планирования третьей части?

Пример сценария, используемого для выполнения пакета:

*Declare @execution_id bigint
EXEC [SSISDB].[catalog].[create_execution] @package_name=N'Extract_Job.dtsx',  @execution_id=@execution_id OUTPUT, @folder_name=N'ETL', @project_name=N'ETL', @use32bitruntime=False, @reference_id=Null
Select @execution_id
DECLARE @var0 smallint = 1
EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,  @object_type=50, @parameter_name=N'LOGGING_LEVEL', @parameter_value=@var0
EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,  @object_type=50, @parameter_name=N'SYNCHRONIZED',  @parameter_value= 1; -- turn on synchronized execution
EXEC [SSISDB].[catalog].[start_execution] @execution_id
GO*

Вещи, которые я пробовал

  • Использование команды DTSEXEC. Это, однако, не отправляет код возврата, а также работает синхронно и должно выполняться синхронно
  • У стороннего планировщика есть плагин для каталога служб SSIS, но есть неразрешенная ошибка, поэтому он не работает с текущей версией

3 ответа

Решение

Хотя использование T-SQL для выполнения пакета служб SSIS действительно работает, однако кажется, что DTExec все еще более удобен и стабилен. Я обнаружил, что в новой версии DTExec есть опция (плохо документированная) для передачи параметра, позволяющего синхронную обработку. Использование этого метода также позволяет возвращать код завершения, что является проблемой, с которой я столкнулся при использовании опции T-SQL.

Пример скрипта:

DTExec.exe /ISSERVER "\SSISDB\project\package_name.dtsx" /SERVER "server_name" /Par "$ServerOption::SYNCHRONIZED(Boolean)";True

Старая версия dtexec не будет поддерживать новые параметры, убедитесь, что вы выполняете новую версию, если обе они доступны на сервере. Чтобы проверить, какая версия находится в пути поиска (по умолчанию), используйте "ГДЕ DTEXEC". Тип "DTEXEC /?" и проверьте, появляются ли новые параметры в тексте справки, если нет, добавьте в префикс выполнения команды правильный путь.

Местоположение новой версии

C:\Program Files\Microsoft SQL Server\110\DTS\Binn\DTExec.exe

Старая версия местоположения

C:\Program Files (x86)\Microsoft SQL Server\110\DTS\Binn\DTExec.exe

Сделано мое СИНХРОННОЕ в рамках хранимой процедуры. Использовано следующее

EXEC [SSISDB].[catalog].[create_execution]
@package_name = N'FixProductType.dtsx', 
@execution_id = @execution_id OUTPUT, 
@folder_name = N'BI', 
@project_name = N'DataCleaning',
@use32bitruntime = False;

EXEC [SSISDB].[catalog].[set_execution_parameter_value] 
@execution_id, 
@object_type = 50, 
@parameter_name = N'LOGGING_LEVEL', 
@parameter_value = 1;

EXEC [SSISDB].[catalog].[start_execution] @execution_id;

DECLARE @status AS BIGINT = 1;
WHILE(@status = 1 OR @status = 2 OR @status = 5 OR @status= 8)
BEGIN
PRINT @status
PRINT 'waiting 5 seconds for Package to finish'
WAITFOR DELAY '00:00:5';

SET @status = (SELECT [Status] FROM SSISDB.[catalog].[executions]
        WHERE execution_id = @execution_id);
END

Можете ли вы использовать [catalog].[executions] вид и @execution_id как объяснено в этом посте:

http://sqlblog.com/blogs/jamie_thomson/archive/2011/07/16/ssis-logging-in-denali.aspx

получить результат выполнения?

Обычно я ожидаю, что start_execution хранимая процедура будет возвращать результат, но документ не указывает на это. Не больно, хотя попробовать.

DECLARE @Result INT
EXEC @Result = [SSISDB].[catalog].[start_execution] @execution_id
SELECT @Result
Другие вопросы по тегам