Creazione di una trasformazione asincrona con il componente script

Utilizzare un componente di trasformazione nel flusso di dati di un pacchetto di Integration Services per modificare e analizzare i dati quando vengono passati dall'origine alla destinazione. Una trasformazione con output sincroni elabora ogni riga di input non appena viene passata attraverso il componente. Una trasformazione con output asincroni potrebbe invece attendere di ricevere tutte le righe di input prima di completare l'elaborazione oppure inviare determinate righe all'output prima di aver ricevuto tutte le righe di input. In questo argomento viene descritta una trasformazione asincrona. Se l'elaborazione richiede una trasformazione sincrona, vedere Creazione di una trasformazione sincrona con il componente script. Per ulteriori informazioni sulle differenze tra componenti sincroni e asincroni, vedere Informazioni sulle trasformazioni sincrone e asincrone.

Per una panoramica del componente script, vedere Estensione del flusso di dati con il componente script.

Il componente script e il codice dell'infrastruttura che genera semplificano il processo di sviluppo di un componente del flusso di dati personalizzato. Tuttavia, per comprendere il funzionamento del componente script, può risultare utile leggere informazioni sui passaggi necessari per lo sviluppo di un componente del flusso di dati personalizzato nella sezione Sviluppo di un componente del flusso di dati personalizzato, in particolare Sviluppo di un componente di trasformazione personalizzato con output sincroni.

Introduzione ai componenti di trasformazione asincroni

Quando si aggiunge un componente script alla scheda Flusso di dati di Progettazione SSIS, viene visualizzata la finestra di dialogo Seleziona tipo componente script in cui si richiede di preconfigurare il componente come origine, trasformazione o destinazione. In questa finestra di dialogo selezionare Trasformazione.

Configurazione di un componente di trasformazione asincrono in modalità di progettazione metadati

Dopo aver selezionato l'opzione per creare un componente di trasformazione, configurare il componente utilizzando Editor trasformazione Script. Per ulteriori informazioni, vedere Configurazione del componente script nell'editor corrispondente.

Per selezionare il linguaggio di scripting che verrà utilizzato dal componente script, impostare la proprietà ScriptLanguage nella pagina Script della finestra di dialogo Editor trasformazione Script.

Nota

Per impostare il linguaggio di scripting predefinito per il componente script, utilizzare l'opzione Linguaggio di scripting nella pagina Generale della finestra di dialogo Opzioni. Per ulteriori informazioni, vedere Pagina Generale.

Un componente di trasformazione del flusso di dati include un input e supporta uno o più output. La configurazione dell'input e degli output del componente è uno dei passaggi che è necessario completare in modalità di progettazione metadati, tramite Editor trasformazione Script, prima di scrivere lo script personalizzato.

Configurazione delle colonne di input

Un componente di trasformazione creato tramite il componente script include un unico input.

Nella pagina Colonne di input di Editor trasformazione Script l'elenco di colonne contiene le colonne disponibili dell'output del componente a monte nel flusso di dati. Selezionare le colonne che si desidera trasformare o passare. Contrassegnare le colonne che si desidera trasformare sul posto come di lettura/scrittura.

Per ulteriori informazioni sulla pagina Colonne di input di Editor trasformazione Script, vedere Editor trasformazione Script (pagina Colonne di input).

Configurazione di input, output e colonne di output

Un componente di trasformazione supporta uno o più output.

In genere una trasformazione con output asincroni include due output. Ad esempio, per il conteggio del numero di indirizzi di una specifica città, è possibile passare i dati degli indirizzi a un output, inviando il risultato dell'aggregazione a un altro output. L'output di aggregazione richiede anche una nuova colonna di output.

Nella pagina Input e output di Editor trasformazione Script è possibile verificare che è stato creato un singolo output per impostazione predefinita, ma non sono state create colonne di output. In questa pagina dell'editor è possibile configurare gli elementi seguenti:

  • È possibile creare uno o più output aggiuntivi, ad esempio un output per il risultato di un'aggregazione. Utilizzare i pulsanti Aggiungi output e Rimuovi output per gestire gli output del componente di trasformazione asincrono. Impostare la proprietà SynchronousInputID di ogni output su zero per indicare che l'output non si limita a passare i dati da un componente a monte o a trasformarli sul posto nelle righe e nelle colonne esistenti. Questa impostazione rende gli output asincroni rispetto all'input.

  • È possibile assegnare un nome descrittivo all'input e agli output. Il componente script utilizza questi nomi per generare le proprietà delle funzioni di accesso tipizzate che verranno utilizzate per fare riferimento all'input e agli output nello script.

  • In genere una trasformazione asincrona aggiunge colonne al flusso di dati. Quando la proprietà SynchronousInputID di un output è impostata su zero, a indicare che l'output non si limita a passare i dati da un componente a monte o a trasformarli sul posto nelle righe e nelle colonne esistenti, è necessario aggiungere e configurare in modo esplicito le colonne di output nell'output. Tali colonne non devono necessariamente avere gli stessi nomi delle colonne di input a cui sono mappate.

  • È possibile aggiungere più colonne per includere ulteriori informazioni. È necessario scrivere codice personalizzato per inserire dati nelle colonne aggiuntive. Per informazioni sulla riproduzione del comportamento di un output degli errori standard, vedere Simulazione di un output degli errori per il componente script.

Per ulteriori informazioni sulla pagina Input e output di Editor trasformazione Script, vedere Editor trasformazione Script (pagina Input e output).

Aggiunta di variabili

Se si desidera utilizzare nello script i valori di variabili esistenti, è possibile aggiungerle nei campi delle proprietà ReadOnlyVariables e ReadWriteVariables nella pagina Script di Editor trasformazione Script.

Quando si aggiungono più variabili nei campi delle proprietà, separare i relativi nomi con virgole. È inoltre possibile selezionare più variabili facendo clic sul pulsante con i puntini di sospensione () accanto ai campi delle proprietà ReadOnlyVariables e ReadWriteVariables e selezionando le variabili nella finestra di dialogo Seleziona variabili.

Per informazioni generali sull'utilizzo delle variabili con il componente script, vedere Utilizzo di variabili nel componente script.

Per ulteriori informazioni sulla pagina Script di Editor trasformazione Script, vedere Editor trasformazione Script (pagina Script).

Scripting di un componente di trasformazione asincrono in modalità di progettazione codice

Dopo aver configurato tutti i metadati per il componente, è possibile scrivere lo script personalizzato. Nella pagina Script di Editor trasformazione Script fare clic su Modifica script per aprire l'IDE di Microsoft Visual Studio Tools for Applications (VSTA), in cui è possibile aggiungere lo script personalizzato. Il linguaggio di scripting che si utilizza varia a seconda che sia stato selezionato Microsoft Visual Basic 2008 o Microsoft Visual C# 2008 come linguaggio di scripting per la proprietà ScriptLanguage nella pagina Script.

Per importanti informazioni applicabili a tutti i tipi di componenti creati tramite il componente script, vedere Codifica e debug del componente script.

Informazioni sul codice generato automaticamente

Quando si apre l'IDE di VSTA dopo la creazione e la configurazione di un componente di trasformazione, la classe ScriptMain modificabile viene visualizzata nell'editor del codice con stub per i metodi ProcessInputRow e CreateNewOutputRows. La classe ScriptMain è quella in cui si scriverà il codice personalizzato, mentre ProcessInputRow è il metodo più importante in un componente di trasformazione. Il metodo CreateNewOutputRows viene in genere utilizzato in un componente di origine, che è simile a una trasformazione asincrona in quanto entrambi i componenti devono creare le rispettive righe di output.

Se si apre la finestra Esplora progetti in VSTA, è possibile rilevare che il componente script ha generato anche gli elementi di progetto BufferWrapper e ComponentWrapper di sola lettura. La classe ScriptMain eredita dalla classe UserComponent nell'elemento di progetto ComponentWrapper.

In fase di esecuzione il motore flusso di dati chiama il metodo PrimeOutput nella classe UserComponent, che esegue l'override del metodo PrimeOutput della classe padre ScriptComponent. Il metodo PrimeOutput chiama a sua volta il metodo CreateNewOutputRows.

In seguito, il motore flusso di dati richiama il metodo ProcessInput nella classe UserComponent, che esegue l'override del metodo ProcessInput della classe padre ScriptComponent. Il metodo ProcessInput a sua volta esegue il ciclo delle righe nel buffer di input e chiama il metodo ProcessInputRow una volta per ogni riga.

Scrittura di codice personalizzato

Per completare la creazione di un componente di trasformazione asincrono, è necessario utilizzare il metodo ProcessInputRow sottoposto a override per elaborare i dati in ogni riga del buffer di input. Poiché gli output non sono sincroni rispetto all'input, è necessario scrivere in modo esplicito le righe di dati negli output.

In una trasformazione asincrona è possibile utilizzare il metodo AddRow per aggiungere righe all'output, se necessario, dall'interno del metodo ProcessInputRow o ProcessInput. Non è necessario utilizzare il metodo CreateNewOutputRows. Se si scrive una singola riga di risultati, ad esempio i risultati di un'aggregazione, in un determinato output, è possibile creare dapprima la riga di output utilizzando il metodo CreateNewOutputRows e inserire i valori in seguito dopo l'elaborazione di tutte le righe di input. Tuttavia, non risulta utile creare più righe nel metodo CreateNewOutputRows, perché il componente script consente di utilizzare solo la riga corrente in un input o in un output. Il metodo CreateNewOutputRows è più importante in un componente di origine, in cui non sono presenti righe di input da elaborare.

È anche possibile eseguire l'override del metodo ProcessInput stesso, in modo da poter eseguire un'elaborazione aggiuntiva preliminare o finale prima o dopo aver eseguito il ciclo del buffer di input e aver chiamato ProcessInputRow per ogni riga. Ad esempio, in uno degli esempi di codice di questo argomento viene eseguito l'override di ProcessInput per contare il numero di indirizzi in una specifica città quando ProcessInputRow esegue il ciclo delle righe.. Nell'esempio il valore di riepilogo viene scritto nel secondo output dopo l'elaborazione di tutte le righe. L'output dell'esempio viene completato in ProcessInput, perché quando viene chiamato PostExecute non sono più disponibili buffer di output.

A seconda dei requisiti, è anche possibile scrivere script nei metodi PreExecute e PostExecute, disponibili nella classe ScriptMain, per eseguire l'elaborazione preliminare o finale.

Nota

Se si sviluppa un componente del flusso di dati personalizzato da zero, è importante eseguire l'override del metodo PrimeOutput per memorizzare nella cache i riferimenti ai buffer di output in modo da poter aggiungere righe di dati ai buffer in un secondo momento. Nel componente script questa operazione non è necessaria perché è disponibile una classe generata automaticamente che rappresenta ogni buffer di output nell'elemento di progetto BufferWrapper.

Esempio

In questo esempio è illustrato il codice personalizzato necessario nella classe ScriptMain per creare un componente di trasformazione asincrono.

Nota

Negli esempi viene utilizzata la tabella Person.Address del database di esempio AdventureWorks2008R2 e vengono passate la prima e la quarta colonna, ovvero int AddressID e nvarchar(30) City, attraverso il flusso di dati. Gli stessi dati vengono utilizzati negli esempi relativi a origine, trasformazione e destinazione in questa sezione. Per ogni esempio, sono documentati ulteriori prerequisiti e presupposti.

In questo esempio viene illustrato un componente di trasformazione asincrono con due output. Questa trasformazione passa le colonne AddressID e City a un output, mentre conta il numero di indirizzi di una specifica città (Redmond, Washington, U.S.A.), quindi restituisce il valore risultante a un secondo output.

Se si desidera eseguire questo codice di esempio, è necessario configurare il pacchetto e il componente come segue:

  1. Aggiungere un nuovo componente script all'area di progettazione del flusso di dati e configurarlo come trasformazione.

  2. Connettere l'output di un'origine o di un'altra trasformazione al nuovo componente di trasformazione nella finestra di progettazione. Questo output deve fornire i dati della tabella Person.Address del database di esempio AdventureWorks2008R2 che contiene almeno le colonne AddressID e City.

  3. Aprire Editor trasformazione Script. Nella pagina Colonne di input selezionare le colonne AddressID e City.

  4. Nella pagina Input e output aggiungere e configurare le colonne di output AddressID e City nel primo output. Aggiungere un secondo output, quindi aggiungere una colonna di output per il valore di riepilogo nel secondo output. Impostare la proprietà SynchronousInputID del primo output su 0, perché in questo esempio ogni riga di input viene copiata in modo esplicito nel primo output. La proprietà SynchronousInputID dell'output appena creato è già impostata su 0.

  5. Rinominare l'input, gli output e la nuova colonna di output specificando nomi più descrittivi. Nell'esempio si utilizzano MyAddressInput come nome dell'input, MyAddressOutput e MySummaryOutput per gli output e MyRedmondCount per la colonna di output nel secondo output.

  6. Nella pagina Script fare clic su Modifica script e immettere lo script seguente. Chiudere quindi l'ambiente di sviluppo dello script e Editor trasformazione Script.

  7. Creare e configurare un componente di destinazione per il primo output in cui sono previste le colonne AddressID e City, ad esempio una destinazione di SQL Server, oppure il componente di destinazione di esempio illustrato in Creazione di una destinazione con il componente script. Connettere quindi il primo output della trasformazione, MyAddressOutput, al componente di destinazione. Per creare una tabella di destinazione, è possibile eseguire il comando Transact-SQL seguente nel database AdventureWorks2008R2:

    CREATE TABLE [Person].[Address2](
        [AddressID] [int] NOT NULL,
        [City] [nvarchar](30) NOT NULL
    )
    
  8. Creare e configurare un altro componente di destinazione per il secondo output. Connettere quindi il secondo output della trasformazione, MySummaryOutput, al componente di destinazione. Poiché il secondo output scrive una singola riga con un singolo valore, è possibile configurare facilmente una destinazione con una gestione connessione file flat che si connette a un nuovo file con una singola colonna. Nell'esempio questa colonna di destinazione è denominata MyRedmondCount.

  9. Eseguire l'esempio.

Public Class ScriptMain
    Inherits UserComponent

    Private myRedmondAddressCount As Integer

    Public Overrides Sub CreateNewOutputRows()

        MySummaryOutputBuffer.AddRow()

    End Sub

    Public Overrides Sub MyAddressInput_ProcessInput(ByVal Buffer As MyAddressInputBuffer)

        While Buffer.NextRow()
            MyAddressInput_ProcessInputRow(Buffer)
        End While

        If Buffer.EndOfRowset Then
            MyAddressOutputBuffer.SetEndOfRowset()
            MySummaryOutputBuffer.MyRedmondCount = myRedmondAddressCount
            MySummaryOutputBuffer.SetEndOfRowset()
        End If

    End Sub

    Public Overrides Sub MyAddressInput_ProcessInputRow(ByVal Row As MyAddressInputBuffer)

        With MyAddressOutputBuffer
            .AddRow()
            .AddressID = Row.AddressID
            .City = Row.City
        End With

        If Row.City.ToUpper = "REDMOND" Then
            myRedmondAddressCount += 1
        End If

    End Sub

End Class
public class ScriptMain:
    UserComponent

{
    private int myRedmondAddressCount;

    public override void CreateNewOutputRows()
    {

        MySummaryOutputBuffer.AddRow();

    }

    public override void MyAddressInput_ProcessInput(MyAddressInputBuffer Buffer)
    {

        while (Buffer.NextRow())
        {
            MyAddressInput_ProcessInputRow(Buffer);
        }

        if (Buffer.EndOfRowset())
        {
            MyAddressOutputBuffer.SetEndOfRowset();
            MySummaryOutputBuffer.MyRedmondCount = myRedmondAddressCount;
            MySummaryOutputBuffer.SetEndOfRowset();
        }

    }

    public override void MyAddressInput_ProcessInputRow(MyAddressInputBuffer Row)
    {

        {
            MyAddressOutputBuffer.AddRow();
            MyAddressOutputBuffer.AddressID = Row.AddressID;
            MyAddressOutputBuffer.City = Row.City;
        }

        if (Row.City.ToUpper() == "REDMOND")
        {
            myRedmondAddressCount += 1;
        }

    }

}
Icona di Integration Services (piccola) Rimanere aggiornati con Integration Services

Per informazioni sui download, gli articoli, gli esempi e i video Microsoft più recenti, nonché sulle soluzioni selezionate dalla community, visitare la pagina Integration Services su MSDN o TechNet:

Per ricevere notifica automatica su questi aggiornamenti, sottoscrivere i feed RSS disponibili nella pagina.