SQL Server ed ALM su database


Il blog di Alessandro Alpi
Archivio Posts
Anno 2018

Anno 2017

Anno 2016

Anno 2015

Anno 2014

Anno 2013

Anno 2012

Anno 2011

Anno 2010

Anno 2009

Anno 2008

Anno 2007

Anno 2006

Come scrivere codice con gli Script (task e component)

Durante alcuni corsi che ho tenuto di recente ho notato un pochino di sgomento nella gestione del codice dei due oggetti di scripting presenti su SSIS.
Ne esistono di due tipi:

- uno nel control flow (Script Task)
- uno nel data flow (Script Component)

Mentre il primo ci consente di effettuare operazioni spot e particolari snippet per assolvere funzionalità al di fuori dell'ambito della trasformazione dei dati, il secondo si occupa di eseguire istruzioni riga per riga, all'interno della trasformazione stessa.
Tra i due task ci sono differenze che balzano subito all'occhio, ma quelle più "fastidiose" sono a livello di coding.
Prima di arrivare a questo step, possiamo notare intanto le seguenti differenze:

a) Utilizzo
- Script Task può essere usato solo in un modo, ovvero come un'area in cui effettuare uno script in VB.NET (C# per chi possiede la versione 2008 di SSIS).
- Script Component può essere usato come sorgente, o come trasformazione, o come destinazione. I tre si differiscono per i metodi da implementare e per la presenza o meno di buffer di input e/o output. Infatti una sorgente NON HA input, ha solo output, destinazione HA SOLO input e non ha output, trasformazione ha ENTRAMBI i buffer di Input e Output.

b) Editor
- Script Task consente di dichiarare solo le principali proprietà, e quindi Nome, Descrizione, Variabili di sola Lettura, Variabili di lettura e scrittura, rispettivamente con le due proprietà ReadOnlyVariables e ReadWriteVariables.
- Script Component, oltre alle suddette impostazioni consente di definire gli eventuali input/output. Nel caso di sorgente solo gli output, nel caso di destinazione solo gli input e nel caso di trasformazione, come sempre, entrambi i buffer. La finestra, nel caso di trasformazione è la seguente:



In input columns avremo le colonne passate dai metadati del task che si dirige verso lo script e nell'output l'elenco di quelli che definiremo noi per proseguire nella pipeline.
In ognuno dei due task, la sintassi per popolare la lista delle variabili da passare nelle due proprietà sopra indicate è:

Namespace::NomeVariabile

Fate attenzione perchè i nomi sono CASE SENSITIVE.
Per chi ha SSIS 2008 ora non vi è più pericolo di sbagliare i nomi, finalmente è stata predisposta una lista delle variabili disponibili da spuntare. L'elenco dei valori è creato in base alle spunte:


c) Coding
- Script Task accede alle variabili passate con la seguente sintassi:
Dts.Variables("Namespace::NomeVariabile").Value

per chi ha 2008 e può usare C#:

Dts.Variables["Namespace::NomeVariabile"].Value

Quindi, per evitare di dover riscrivere sempre la solita stringa, è consigliabile fare uso delle proprietà (VB 2005):

Private ReadOnly Property MiaProprietaLettura() As String

        Get

            Return Dts.Variables("NameSpace:NomeVariabile").Value.ToString()

        End Get

    End Property

 

    Private Property MiaProprieta() As String

        Get

            Return Dts.Variables("NameSpace:NomeVariabile").Value.ToString()

        End Get

        Set(ByVal value As String)

            Dts.Variables("NameSpace:NomeVariabile").Value = value

        End Set

    End Property

 

 

    Public Sub Main()

        '

        MsgBox(Me.MiaProprietaLettura)

 

        Me.MiaProprieta = "CIAO"

        '

        Dts.TaskResult = ScriptResults.Success

    End Sub


come possiamo vedere, la proprietà mi consente di gestire il codice del Main in maniera più leggibile e semplice da manutenere.

- Script Component consente di accedere direttamente ad una collezione Variables che contiene tutte le variabili di lettura e lettura/scrittura passate nelle due proprietà. In poche parole crea già l'infrastruttura che ci siamo costruiti noi nello script task. Quindi per accedere ad una variabile è sufficiente fare:

Variables.NomeVariabile

- Script Task ha un metodo Main() e tutti gli altri sono metodi dichiarati dall'utente e quindi proprietari di chi sta scrivendo il codice. Tutta le invocazioni sono fatte all'interno del metodo Main, una ed una sola volta per ogni chiamata al task

- Script Component, in base anche a come viene utilizzato, deve necessariamente implementare dei metodi (farne l'override). Ma vediamo i casi:
Caso Sorgente:

imposto gli output (non ho input)


nell'esempio, due campi ID e Descrizione, intero e stringa lunga 50 caratteri.

implemento i metodi per produrre l'output

    Public Overrides Sub PreExecute()

        MyBase.PreExecute()

        '

        ' Elenco delle operazioni pre esecuzione

        '

    End Sub

 

    Public Overrides Sub PostExecute()

        MyBase.PostExecute()

        '

        ' Elenco delle operazioni post esecuzione

        ' qui è possibile accedere alle variabili!!!

        ' esempio: Me.Variables.NomeVariabile = 100

        '

    End Sub

 

    Public Overrides Sub CreateNewOutputRows()

        '

        ' In base al nome che abbiamo dato all'output nella sezione inputs and outputs viene

        ' generato un oggetto chiamato <NomeOutput>Buffer. Chiamare il metodo AddRow per inserire righe

        ' nell'output.

        ' esempio:

        SorgenteOutputBuffer.AddRow()

 

        SorgenteOutputBuffer.ID = 1

        SorgenteOutputBuffer.Descrizione = "ciao"

 

        ' ho inserito una riga nel buffer con le costanti 1 e "ciao"

        '

    End Sub

Caso destinazione:

imposto gli input (non ho output)


ho selezionato due valori che il precedente task mi ha passato (ho usato lo script sorgente definito nel punto precedente) ed ora ridefinisco i metodi:

    Public Overrides Sub PreExecute()

        MyBase.PreExecute()

        '

        ' Elenco delle operazioni pre esecuzione

        '

    End Sub

 

    Public Overrides Sub PostExecute()

        MyBase.PostExecute()

        '

        ' Elenco delle operazioni post esecuzione

        ' qui è possibile accedere alle variabili!!!

        ' esempio: Me.Variables.NomeVariabile = 100

        '

    End Sub

 

    Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)

        '

        ' qui posso usare l'oggetto Row, che è la riga che sta "passando" durante l'esecuzione

        ' della trasformazione:

        If Row.ID = 1 And Row.Descrizione = "ciao" Then

            ' esempio: sollevo un'eccezione

            Throw New Exception("Errore")

        End If

        '

    End Sub

Caso trasformazione:

imposto gli input e gli output (combinazione dei precedenti)


e ridefinisco i metodi

    Public Overrides Sub PreExecute()

        MyBase.PreExecute()

        '

        ' Elenco delle operazioni pre esecuzione

        '

    End Sub

 

    Public Overrides Sub PostExecute()

        MyBase.PostExecute()

        '

        ' Elenco delle operazioni post esecuzione

        ' qui è possibile accedere alle variabili!!!

        ' esempio: Me.Variables.NomeVariabile = 100

        '

    End Sub

 

    Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)

        '

        ' Eseguo le operazioni dall'input

        '

    End Sub

 

 

    Public Overrides Sub CreateNewOutputRows()

        ' accedo all'oggetto definito come outputbuffer (Output 0 nell'esempio)

        Output0Buffer.AddRow()

 

        Output0Buffer.IDNuovo = 2

        Output0Buffer.DescrizioneNuova = "miao"

 

    End Sub



Questi sono i metodi da ridefinire nei tre casi.
Come possiamo notare, soprattutto nel component del data flow, l'implementazione di una apparentemente semplice operazione risulta un po' macchinosa. Ma una volta definita la metodologia, il tutto si riduce a queste regole. Certo, bisogna conoscere un pochino i linguaggi (ripeto, con 2008 è possibile anche usare C# ), alcune parole chiave, i primi cenni sulla programmazione ad oggetti, ma direi che sono scogli facilmente superabili con studio e pazienza

Stay tuned!

Categoria: SSIS 2005 tips
giovedì, 11 giu 2009 Ore. 01.31
Statistiche
  • Views Home Page: 599.571
  • Views Posts: 1.065.380
  • Views Gallerie: 637.597
  • n° Posts: 484
  • n° Commenti: 273



















Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003