SSIS Script Component Transformation – własna transformacja danych

2012-07-27

W poprzednim temacie opisałem użycie komponentu Script jako własnego źródła danych w Integration Services. Dzisiaj przedstawię kolejne zastosowanie Script Component, a mianowicie tworzenie własnej transformacji danych. Konfiguracja komponentu po umieszczeniu go w elemencie Data Flow przebiega następująco:

1. Skrypt ustawiamy jako transformację danych:

2. W sekcji Script poprzez właściwości ReadOnlyVariables i ReadWriteVariables udostępniamy dla skryptu zmienne.

3. W sekcji Input Columns wybieramy dostępne kolumny wejściowe oraz określamy czy wartości w nich podlegają modyfikacji (Usage Type):

4. W sekcji Inputs and Outputs definiujemy wyjściowe zbiory danych. Najważniejsze ustawienia każdego zbioru to SynchronousInputID oraz ExclusionGroup. Opcja SynchronousInputID określa, czy dany zbiór wyjściowy jest zsynchronizowany ze wskazanym zbiorem wejściowym. Jeżeli w opcji tej wybierzemy zbiór wejściowy, dane wyjście automatycznie otrzyma taką samą strukturę kolumn (istnieje możliwość dodania nowych kolumn, wówczas podczas przetwarzania rekordów należy uzupełniać dla nich dane). Jeżeli nie wskażemy zbioru wejściowego musimy ręcznie zdefiniować kolumny, a w samym skrypcie zadbać o wypełnienie zbioru wyjściowego danymi. Z kolei opcja ExclusionGroup odnosi się do zbiorów wyjściowych zsynchronizowanych z danym wejściem. Jeżeli jej wartość będzie wynosiła 0 na dane wyjście automatycznie przesyłane będą wszystkie rekordy z wybranego wejścia (po ewentualnych modyfikacjach i uzupełnieniu danych w dodatkowych kolumnach). Jeżeli jej wartość będzie większa od 0 wybrane rekordy muszą być kierowane do danego wyjścia za pomocą metody DirectRowTo<nazwa_wyjścia>(). Na poniższym przykładzie zdefiniowane zostały trzy zbiory wyjściowe:

  • MyOutput1 (zsynchronizowany z wejściem, ExclusionGroup = 0) – wszystkie rekordy wejściowe po przetworzeniu są automatycznie przesyłane na wyjście;
  • MyOutput2 (zsynchronizowany z wejściem, ExclusionGroup > 0) – wybrane rekordy wejściowe po przetworzeniu są kierowane do wyjścia przy użyciu metody Row.DirectRowToMyOutput2();
  • MyOutput3 (brak synchronizacji z wejściem) – konieczne jest zdefiniowanie kolumn zbioru wyjściowego, rekordy są w nim umieszczane poprzez metodę MyOutput3Buffer.AddRow();

5. W sekcji Connection Managers udostępniamy dla skryptu istniejące połączenia (oczywiście jeżeli chcemy z nich skorzystać).

Po zakończeniu konfiguracji możemy przejść do kodu C# (sekcja Script -> Edit Script). Skrypt składa się z klasy ScriptMain, w której implementujemy wybrane metody:

  • AcquireConnections – metoda, w której możemy nawiązać połączenie z zewnętrznym źródłem (możemy zdefiniować nowe połączenie lub wykorzystać udostępnione, w drugim przypadku używamy obiektu Connections zawierającego listę połączeń oraz metody AcquireConnection udostępniającej konkretne połączenie);
  • PreExecute – metoda wykonywana jest przed rozpoczęciem procesu przetwarzania danych;
  • <nazwa_wejścia>_ProcessInput – metoda w pętli dla każdego rekordu w buforze wejściowym wywołuje metodę <nazwa_wejścia>_ProcessInputRow;
  • <nazwa_wejścia>_ProcessInputRow – metoda wykonywana dla każdego rekordu wejściowego, tutaj implementujemy logikę transformacji oraz przekierowujemy rekordy do zbiorów wyjściowych;
  • CreateNewOutputRows – metoda, w której możemy dodawać nowe rekordy do wyjściowych zbiorów danych (wywołanie metody AddRow na wyjściowym zbiorze dodaje do niego nowy rekord, dla którego następnie należy uzupełnić dane), do zbioru odwołujemy się poprzez <nazwa_wyjścia>Buffer;
  • PostExecute – metoda wykonywana po zakończeniu procesu przetwarzania danych;
  • ReleaseConnections – w tej metodzie należy zamknąć połączenia do zewnętrznych źródeł;

Wszystkie dostępne metody: ScriptComponent Class

Poniższy skrypt przetwarza rekordy ze zbioru wejściowego i umieszcza dane w trzech zbiorach wyjściowych zgodnie z ich konfiguracją:

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
    public override void MyInput_ProcessInputRow(MyInputBuffer Row)
    {
        //MyOutput1
        Row.Name = Row.Name.ToLower();

        //MyOutput2
        if (Row.Id > 1)
            Row.DirectRowToMyOutput2();

        //MyOutput3
        MyOutput3Buffer.AddRow();
        MyOutput3Buffer.Id = Row.Id + 10;
        MyOutput3Buffer.Name = Row.Name.Substring(1, 1);
    }

    public override void CreateNewOutputRows()
    {
        MyOutput3Buffer.AddRow();
        MyOutput3Buffer.Id = 0;
        MyOutput3Buffer.Name = "New";
    }
}

Użycie przygotowanego komponentu:

W wyniku jego działania otrzymujemy oczekiwane dane (od góry: zbiór wejściowy, wyjście MyOutput1, wyjście MyOutput2, wyjście MyOutput3):

Więcej informacji na ten temat: MSDN1, MSDN2.

Reklamy

Posted on 2012-07-27, in .NET/C# and tagged , , , , . Bookmark the permalink. 1 komentarz.

  1. Przydatny post, dzięki!

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s

%d blogerów lubi to: