Поделиться через


Создание синхронного преобразования с помощью компонента скрипта

Компонент преобразования используется в потоке данных пакета служб Integration Services для изменения и анализа данных, передаваемых из источника в назначение. Преобразование с синхронными выходами обрабатывает каждую входную строку, проходящую через компонент. Преобразование с асинхронными выходами ожидает, пока не получит все входные строки, чтобы завершить обработку. В этом разделе рассматривается синхронное преобразование. Сведения об асинхронных преобразованиях см. в разделе Создание асинхронного преобразования с помощью компонента скрипта. Дополнительные сведения о различиях между синхронными и асинхронными выходами см. в разделе Основные сведения о синхронных и асинхронных преобразованиях.

Общие сведения о компоненте скрипта см. в разделе Расширение потока данных с помощью компонента сценария.

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

Приступая к работе над компонентом синхронного преобразования

При добавлении компонента скриптов на панель «Поток данных» конструктора служб SSIS открывается диалоговое окно Выбор типа компонента скрипта, где нужно выбрать тип компонента – источник, назначение или преобразование. В этом диалоговом окне выберите пункт Преобразование.

Настройка компонента синхронного преобразования в режиме конструктора метаданных

После выбора варианта для создания компонента преобразования выполняется настройка компонента с помощью редактора преобразования «Скрипт». Дополнительные сведения см. в разделе Настройка компонента сценария в редакторе компонента сценария.

Чтобы определить язык скрипта для компонента скрипта, необходимо задать свойство ScriptLanguage на странице Скрипт в редакторе преобразования «Скрипт».

ПримечаниеПримечание

Чтобы установить язык скрипта по умолчанию для компонента скрипта, воспользуйтесь параметром Язык скрипта страницы Общие диалогового окна Параметры. Дополнительные сведения см. в разделе Страница «Общие».

Компонент преобразования потока данных имеет один вход и поддерживает один или несколько выходов. Настройка входа и выходов компонента является одним из шагов, которые необходимо выполнить в режиме конструктора метаданных с использованием редактора преобразования «Скрипт», прежде чем приступать к написанию пользовательского скрипта.

Настройка входных столбцов

Компонент преобразования имеет один вход.

На странице Входные столбцы в редакторе преобразования «Скрипт» список столбцов содержит доступные столбцы на выходе вышестоящего компонента в потоке данных. Выделите столбцы, которые хотите преобразовать или передать. Пометьте все столбцы, участвующие в преобразовании, как доступные для чтения и записи.

Дополнительные сведения о странице Входные столбцыредактора преобразования «Скрипт» см. в разделе Редактор преобразования «Сценарий» (страница «Входные столбцы»).

Настройка входов, выходов и выходных столбцов

Компонент преобразования поддерживает один или несколько выходов.

На странице Входы и выходы в редакторе преобразования «Скрипт» можно убедиться в том, что создан один выход, который не имеет столбцов. На этой странице редактора может понадобиться настроить следующие элементы.

  • Создайте один или несколько дополнительных выходов, например, имитацию вывода ошибок для строк, содержащих непредвиденные значения. Используйте кнопки Добавить выход и Удалить выход для управления выходами компонента синхронного преобразования. Все входные строки направляются во все доступные выходы, если не указано, что необходимо перенаправлять каждую строку в тот или иной определенный выход. Чтобы указать на необходимость перенаправления строк, следует присвоить свойству ExclusionGroup для выходов ненулевое целочисленное значение. Конкретное целочисленное значение, заданное для свойства ExclusionGroup, не имеет принципиальной важности, однако необходимо использовать одно и то же число последовательно в указанной группе выходов.

    ПримечаниеПримечание

    Также можно использовать ненулевое значение для свойства ExclusionGroup с единственным выходом, если не нужно выводить все строки. Однако в данном случае необходимо явным образом вызвать метод DirectRowTo<outputbuffer> для каждой строки, которая должна быть направлена в выход.

  • Присвойте как можно более описательные имена входу и выходам. Компонент скрипта использует эти имена для создания типизированных свойств метода доступа, с помощью которых в скрипте выполняется обращение к входам и выходам.

  • Для синхронных преобразований оставьте столбцы без изменения. Обычно синхронное преобразование не добавляет столбцы в поток данных. Данные изменяются на месте, прямо в буфере, который передается в следующий компонент потока данных. В подобной ситуации нет необходимости добавлять и настраивать выходные столбцы явным образом для выходов преобразования. Выходы отображаются в редакторе без явно определенных столбцов.

  • Добавьте новые столбцы для имитации вывода ошибок для ошибок на уровне строк. Обычно несколько выходов в одной и той же группе ExclusionGroup имеют один и тот же набор выходных столбцов. Однако при создании имитации вывода ошибок может оказаться целесообразным добавление нескольких столбцов, содержащих сведения об ошибках. Сведения об обработке ошибочных строк в подсистеме обработки потока данных см. в разделе Использование выводов ошибок в компоненте потока данных. Обратите внимание на то, что в компоненте скрипта необходимо написать собственный код для заполнения дополнительных столбцов соответствующими сведениями об ошибках. Дополнительные сведения см. в разделе Имитация вывода ошибок для компонента скрипта.

Дополнительные сведения о странице Входы и выходыредактора преобразования «Скрипт» см. в разделе Редактор преобразования «Сценарий» (страница «Входы и выводы»).

Добавление переменных

Если нужно использовать в скрипте существующие переменные, их можно добавить в поля свойств ReadOnlyVariables и ReadWriteVariables на странице Скрипт в редакторе преобразования «Скрипт».

Если в поле свойства добавляются несколько переменных, их имена нужно разделять запятыми. Также можно выбрать несколько переменных, нажав кнопку с многоточием (), расположенную рядом с полями свойств ReadOnlyVariables и ReadWriteVariables, а затем выбрав переменные в диалоговом окне Выбор переменные.

Общие сведения об использовании переменных в компоненте скрипта см. в разделе Использование переменных в компоненте сценария.

Дополнительные сведения о странице Скриптредактора преобразования «Скрипт» см. в разделе Редактор преобразования «Сценарий» (страница «Сценарий»).

Создание скрипта компонента синхронного преобразования в режиме конструктора кода

После настройки метаданных для компонента можно написать пользовательский скрипт. В редакторе преобразования «Скрипт» на странице Скрипт нажмите кнопку Изменить скрипт, чтобы открыть интегрированную среду разработки средств Microsoft Visual Studio для приложений (VSTA), где можно добавить пользовательский скрипт. Используемый язык скрипта зависит от значения свойства ScriptLanguage на странице Скрипт. Для него можно выбрать язык Microsoft Visual Basic 2008 или Microsoft Visual C# 2008.

Важные сведения, относящиеся ко всем типам компонентов, создаваемых с помощью компонента скрипта, см. в разделе Кодирование и отладка компонента сценария.

Основные сведения об автоматически создаваемом коде

При открытии интегрированной среды разработки VSTA после создания и настройки компонента преобразования, изменяемый класс ScriptMain отображается в редакторе кода с заглушкой для метода ProcessInputRow. Пользовательский код создается в классе ScriptMain, а самым важным методом в компоненте преобразования является ProcessInputRow.

Есть открыть окно Обозреватель объектов в средствах VSTA, можно увидеть, что для компонента скрипта были созданы элементы проекта BufferWrapper и ComponentWrapper, доступные только для чтения. Класс ScriptMain наследует класс UserComponent в элементе проекта ComponentWrapper.

Во время выполнения подсистема обработки потока данных вызывает метод ProcessInput в классе UserComponent, который переопределяет метод ProcessInput родительского класса ScriptComponent. В свою очередь, метод ProcessInput проходит по строкам во входном буфере и вызывает для каждой строки метод ProcessInputRow.

Написание пользовательского кода

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

    Row.City = UCase(Row.City)
    Row.City = (Row.City).ToUpper();

Чтобы завершить создание пользовательского компонента синхронного преобразования, необходимо переопределить метод ProcessInputRow для преобразования данных в каждой строке входного буфера. Когда этот буфер оказывается заполненным, подсистема обработки потока данных передает его следующему компоненту в потоке данных.

В зависимости от потребностей, возможно, понадобится написать скрипт с методами PreExecute и PostExecute, доступными в классе ScriptMain, чтобы обеспечить предварительную или итоговую обработку.

Работа с несколькими выходами

Направление входных строк в один из двух или более возможных выходов не требует большого объема дополнительного пользовательского кода по сравнению со скриптом с единственным выходом, который был рассмотрен выше. Например, в примере с двумя выходами, который приведен далее в этом разделе, содержится следующий пользовательский код:

 [Visual Basic]
    Row.City = UCase(Row.City)
    If Row.City = "REDMOND" Then
        Row.DirectRowToMyRedmondAddresses()
    Else
        Row.DirectRowToMyOtherAddresses()
    End If
 [C#]
        Row.City = (Row.City).ToUpper();

        if (Row.City=="REDMOND")
        {
            Row.DirectRowToMyRedmondAddresses();
        }
        else
        {
            Row.DirectRowToMyOtherAddresses();
        }

В этом примере компонент скрипта формирует методы DirectRowTo<OutputBufferX> на основе имен выходов, настроенных пользователем. Можно использовать аналогичный код для направления строк ошибок в имитированный вывод ошибок.

Примеры

В приведенных здесь примерах демонстрируется пользовательский код, который необходимо использовать в классе ScriptMain для создания компонента синхронного преобразования.

ПримечаниеПримечание

В этих примерах используется таблица Person.Address из образца базы данных База данных AdventureWorks2008R2 и в поток данных передается ее первый и четвертый столбец — int AddressID и nvarchar(30) City. Эти же данные используются в образцах источника, преобразования и назначения, приведенных в этом разделе. Для каждого примера приведены необходимые дополнительные условия и принимаемые предположения.

Пример синхронного преобразования с единственным выходом

В этом примере демонстрируется компонент синхронного преобразования с единственным выходом. Это преобразование передает столбец AddressID без обработки, а столбец City преобразует к верхнему регистру.

Чтобы запустить этот образец кода, необходимо настроить пакет и компонент следующим образом.

  1. Добавьте новый компонент скрипта в область конструктора потока данных и настройте его в качестве преобразования.

  2. Соедините выход источника или другого преобразования с новым компонентом преобразования в конструкторе служб SSIS. Этот выход будет предоставлять данные из таблицы Person.Address образца базы данных База данных AdventureWorks2008R2, которая содержит столбцы AddressID и City.

  3. Откройте редактор преобразования «Скрипт». На странице Input Columns выберите столбцы AddressID и City. Пометьте столбец City как доступный для чтения и записи.

  4. На странице Входы и выходы переименуйте вход и выход, дав им более описательные имена, например, MyAddressInput и MyAddressOutput. Обратите внимание, что идентификатор SynchronousInputID выхода соответствует идентификатору ID входа. Таким образом, нет необходимости добавлять и настраивать выходные столбцы.

  5. На странице Скрипт нажмите кнопку Изменить скрипт и введите следующий скрипт. Затем закройте среду разработки скриптов и редактор преобразования «Скрипт».

  6. Создайте и настройте компонент назначения, ожидающий столбцы AddressID и City, например назначение SQL Server или образец компонента назначения, показанный в разделе Создание назначения с помощью компонента скрипта. Затем соедините выход преобразования с компонентом назначения. Можно создать целевую таблицу, выполнив следующую команду Transact-SQL в базе данных База данных AdventureWorks2008R2:

    CREATE TABLE [Person].[Address2](
        [AddressID] [int] NOT NULL,
        [City] [nvarchar](30) NOT NULL
    )
    
  7. Запустите образец.

Public Class ScriptMain
    Inherits UserComponent

    Public Overrides Sub MyAddressInput_ProcessInputRow(ByVal Row As MyAddressInputBuffer)

        Row.City = UCase(Row.City)

    End Sub

End Class
 [C#]
public class ScriptMain:
    UserComponent

{
    public override void MyAddressInput_ProcessInputRow(MyAddressInputBuffer Row)
    {

        Row.City = (Row.City).ToUpper();

    }

}

Пример синхронного преобразования с двумя выходами

В этом примере демонстрируется компонент синхронного преобразования с двумя выходами. Это преобразование передает столбец AddressID без обработки, а столбец City преобразует к верхнему регистру. Если названием города является «Redmond», строка направляется в один выход. Все остальные строки направляются в другой выход.

Чтобы запустить этот образец кода, необходимо настроить пакет и компонент следующим образом.

  1. Добавьте новый компонент скрипта в область конструктора потока данных и настройте его в качестве преобразования.

  2. Соедините выход источника или другого преобразования с новым компонентом преобразования в конструкторе служб SSIS. Этот выход должен содержать данные из таблицы Person.Address образца базы данных База данных AdventureWorks2008R2, которая содержит по крайней мере столбцы AddressID и City.

  3. Откройте редактор преобразования «Скрипт». На странице Input Columns выберите столбцы AddressID и City. Пометьте столбец City как доступный для чтения и записи.

  4. На странице Входы и выходы создайте второй выход. После создания нового выхода убедитесь в том, что идентификатору SynchronousInputID присвоено значение, совпадающее с идентификатором ID входа. Это свойство уже задано для первого выхода, создаваемого по умолчанию. Для каждого выхода присвойте свойству ExclusionGroup одно и то же ненулевое значение, чтобы предписать распределение входных строк между двумя взаимоисключающими выходами. Нет необходимости добавлять какие-либо выходные столбцы в выходы.

  5. Переименуйте вход и выходы, дав им более описательные имена, например, MyAddressInput, MyRedmondAddresses и MyOtherAddresses.

  6. На странице Скрипт нажмите кнопку Изменить скрипт и введите следующий скрипт. Затем закройте среду разработки скриптов и редактор преобразования «Скрипт».

  7. Создайте и настройте два компонента назначения, ожидающие столбцы AddressID и City, например назначение SQL Server, назначение «Неструктурированный файл» или образец компонента назначения, показанный в разделе Создание назначения с помощью компонента скрипта. Затем соедините каждый из выходов преобразования с одним из компонентов назначения. Можно создать целевые таблицы, выполнив команду Transact-SQL, аналогичную следующей (с соответствующими уникальными именами таблиц) в базе данных База данных AdventureWorks2008R2:

    CREATE TABLE [Person].[Address2](
        [AddressID] [int] NOT NULL,
        [City] [nvarchar](30) NOT NULL
    
  8. Запустите образец.

Public Class ScriptMain
    Inherits UserComponent

    Public Overrides Sub MyAddressInput_ProcessInputRow(ByVal Row As MyAddressInputBuffer)

        Row.City = UCase(Row.City)

        If Row.City = "REDMOND" Then
            Row.DirectRowToMyRedmondAddresses()
        Else
            Row.DirectRowToMyOtherAddresses()
        End If

    End Sub

End Class
public class ScriptMain:
    UserComponent

public override void MyAddressInput_ProcessInputRow(MyAddressInputBuffer Row)
    {

        Row.City = (Row.City).ToUpper();

        if (Row.City == "REDMOND")
        {
            Row.DirectRowToMyRedmondAddresses();
        }
        else
        {
            Row.DirectRowToMyOtherAddresses();
        }

    }
}
Значок служб Integration Services (маленький) Будьте в курсе новых возможностей cлужб Integration Services

Чтобы загрузить последнюю документацию, статьи, образцы и видеоматериалы от Майкрософт, а также лучшие решения от участников сообщества, посетите страницу служб Integration Services на сайтах MSDN или TechNet.

Чтобы получать автоматические уведомления об этих обновлениях, подпишитесь на RSS-каналы, предлагаемые на этой странице.