Отладка пакета во время выполнения

By | August 6, 2014

В SQL Server 2012 была добавлена одна интересная возможность для отладки пакетов SSIS во время выполнения. Но на практике оказалось, что не многие её используют. Это так называемые Data Tap. Устойчивых русских терминов нет, а те, которые используется в MSDN мне совершенно не нравятся, поэтому далее буду использовать оригинальные названия.

В чем же суть? Во время отладки пакета иногда возникает необходимость посмотреть какие данные возвращает поток данных в Data Flow. Во время работы в SQL Server Data Tools (читай Visual Studio) можно к потоку добавить Data Viewers. Но уже с опубликованным проектом это сделать не удастся. Вот тут нам на помощь и приходят Data Tap. Они позволяют перенаправить данные в текстовый файл для последующего анализа.

Нужно учесть один момент. Пакет должен быть развернут в каталоге SSIS в режиме Project Deployment Model.


Чтобы использовать Data Tap вы должны написать скрипт для запуска пакета. Нажмите правой клавишей мыши на пакете и выберите в контекстном меню Execute… (Выполнить…). В диалоговом окне задайте все необходимые значения для параметров и внесите нужные изменения в настройки конфигурации, затем нажмите кнопку Script.

Мой пакет очень простой, поэтому скрипт выглядит просто
Declare @execution_id bigint

EXEC [SSISDB].[catalog].[create_execution] @package_name=N’Package.dtsx’, @execution_id=@execution_id OUTPUT, @folder_name=N’DataTap’, @project_name=N’DataTap’, @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].[start_execution] @execution_id

GO


Для работы с Data Tap есть две хранимые процедуры:

  • add_data_tap
  • add_data_tap_by_guid

Разберем вариант с первой хранимой процедурой. Поместите следующий скрипт перед строкой с start_execution.

EXEC [SSISDB].[catalog].add_data_tap @execution_id = @execution_id, @task_package_path = ‘\Package\Data Flow Task’, @dataflow_path_id_string = ‘Paths[Source.OLE DB Source Output]’,@data_filename = ‘output.txt’

Естественно возникает вопрос откуда я взял значения для параметров (за исключением параметра @execution_id). Для получения этих значений вам надо вернуться в Visual Studio и посмотреть свойства для задачи Data Flow Task (если окно Properties (Свойства) закрыто, то нажмите F4). Для параметра @task_package_path необходимо значение свойства PackagePath.

Для параметра @dataflow_path_id_string вам необходимо посмотреть значение свойства IdentificationString у того потока данных, для которого вы создаете Data Tap.


Обратите внимание на имя файла, в котором будут сохраняться данные. Задано только имя, поэтому файл будет создан в папке \Microsoft SQL Server\110\DTS\DataDumps (для SQL Server 2012) или \Microsoft SQL Server\120\DTS\DataDumps (для SQL Server 2014). Если файл с таким именем уже существует, то создается новый файл с суффиксом (например, output[1].txt).

Кроме того, можно использовать необязательный параметр @max_rows, который задает количество сохраняемых строк (например, чтобы посмотреть только первые 10 строк).

Если вам больше не нужно сохранять данные в файле, то удалите Data Tap с помощью хранимой процедуры remove_data_tap. Также можно отобразить все Data Tap с помощью представления catalog.execution_data_taps.

И не забывайте, что Data Tap создают дополнительную нагрузку и влияют на производительность. Поэтому используйте Data Tap только когда это действительно нужно и не забывайте удалять неиспользуемые.