Creazione di una trasformazione sincrona 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 attende di aver ricevuto tutte le righe di input per completare la relativa elaborazione. In questo argomento viene descritta una trasformazione sincrona. Per informazioni sulle trasformazioni asincrone, vedere Creazione di una trasformazione asincrona con il componente script. Per ulteriori informazioni sulla differenza 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 in modo significativo 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 sincroni

Quando si aggiunge un componente script nel riquadro Flusso di dati di Progettazione SSIS, viene visualizzata la finestra di dialogo Seleziona tipo componente script in cui si richiede di selezionare un tipo di componente Origine, Destinazione o Trasformazione. In questa finestra di dialogo selezionare Trasformazione.

Configurazione di un componente di trasformazione sincrono 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 impostare il linguaggio di scripting del componente script, impostare la proprietà ScriptLanguage nella pagina Script di 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 per il 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 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.

Nella pagina Input e output di Editor trasformazione Script è possibile verificare che è stato creato un singolo output, che tuttavia non include colonne. In questa pagina dell'editor può essere necessario o consigliabile configurare gli elementi seguenti.

  • Creare uno o più output aggiuntivi, ad esempio un output degli errori simulati per le righe che contengono valori imprevisti. Utilizzare i pulsanti Aggiungi output e Rimuovi output per gestire gli output del componente di trasformazione sincrono. Tutte le righe di input vengono indirizzate a tutti gli output disponibili, a meno che non si indichi che si intende reindirizzare ogni riga a uno o all'altro output. Indicare che si intende reindirizzare le righe specificando un valore integer diverso da zero per la proprietà ExclusionGroup degli output. Il valore integer specifico immesso in ExclusionGroup per identificare gli output non è significativo, ma è necessario utilizzare sempre lo stesso valore per il gruppo specificato di output.

    [!NOTA]

    È anche possibile utilizzare un valore diverso da zero per la proprietà ExclusionGroup con un singolo output quando non si desidera restituire tutte le righe come output. In questo caso, tuttavia, è necessario chiamare in modo esplicito il metodo DirectRowTo<outputbuffer> per ogni riga che si desidera inviare all'output.

  • Assegnare un nome più 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.

  • Lasciare le colonne nello stato in cui si trovano per le trasformazioni sincrone. In genere una trasformazione sincrona non aggiunge colonne al flusso di dati. I dati vengono modificati sul posto nel buffer, che viene quindi passato al componente successivo nel flusso di dati. In questo caso, non è necessario aggiungere e configurare in modo esplicito colonne di output negli output della trasformazione. Gli output vengono visualizzati nell'editor senza colonne definite in modo esplicito.

  • Aggiungere le nuove colonne agli output degli errori simulati per gli errori a livello di riga. Normalmente, più output nello stesso oggetto ExclusionGroup dispongono dello stesso set di colonne di output. Tuttavia, se si crea un output degli errori simulati, è possibile aggiungere più colonne per contenere le informazioni sugli errori. Per informazioni sul modo in cui il motore flusso di dati elabora le righe di errore, vedere Utilizzo degli output degli errori in un componente del flusso di dati. Si noti che nel componente script è necessario scrivere codice personalizzato per inserire le informazioni appropriate sugli errori nelle colonne aggiuntive. Per ulteriori informazioni, 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 le 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 sincrono in modalità di progettazione codice

Dopo aver configurato 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 MicrosoftVisual 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 MicrosoftVisual Basic 2008 o MicrosoftVisual 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 uno stub per il metodo ProcessInputRow. La classe ScriptMain è quella in cui si scriverà il codice personalizzato, mentre ProcessInputRow è il metodo più importante in un componente di trasformazione.

Se si apre la finestra Esplora progetti in VSTA, è possibile rilevare che il componente script ha generato anche gli elementi del 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 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

Un componente di trasformazione con output sincroni è il più semplice da scrivere tra tutti i componenti del flusso di dati. L'esempio a singolo output illustrato più avanti in questo argomento è costituito, ad esempio, dal codice personalizzato seguente:

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

Per completare la creazione di un componente di trasformazione sincrono, è possibile utilizzare il metodo ProcessInputRow sottoposto a override per trasformare i dati in ogni riga del buffer di input. Il motore flusso di dati passa questo buffer, quando è pieno, al componente successivo nel flusso di dati.

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

Utilizzo di più output

L'indirizzamento delle righe di input a uno dei due o più output possibili non richiede una quantità maggiore di codice personalizzato rispetto allo scenario a singolo output descritto in precedenza. L'esempio a due output illustrato più avanti in questo argomento è costituito, ad esempio, dal codice personalizzato seguente:

 [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();
        }

In questo esempio il componente script genera automaticamente i metodi DirectRowTo<OutputBufferX>, in base ai nomi degli output configurati. È possibile utilizzare codice simile per indirizzare le righe di errore a un output degli errori simulati.

Esempi

Negli esempi seguenti è illustrato il codice personalizzato necessario nella classe ScriptMain per creare un componente di trasformazione sincrono.

[!NOTA]

Negli esempi viene utilizzata la tabella Person.Address del database di esempio AdventureWorks e vengono passate la prima e la quarta colonna, ovvero intAddressID 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.

Esempio di trasformazione sincrona a singolo output

In questo esempio viene illustrato un componente di trasformazione sincrono con un singolo output. La trasformazione passa la colonna AddressID e converte la colonna City in lettere maiuscole.

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 in Progettazione SSIS. Questo output deve fornire i dati della tabella Person.Address del database di esempio AdventureWorks che contiene le colonne AddressID e City.

  3. Aprire Editor trasformazione Script. Nella pagina Colonne di input selezionare le colonne AddressID e City. Contrassegnare la colonna City come di lettura/scrittura.

  4. Nella pagina Input e output rinominare l'input e l'output con nomi più descrittivi, ad esempio MyAddressInput e MyAddressOutput. Si noti che l'oggetto SynchronousInputID dell'output corrisponde all'oggetto ID dell'input. Pertanto, non è necessario aggiungere e configurare colonne di output.

  5. 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.

  6. Creare e configurare un componente di destinazione 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 l'output della trasformazione al componente di destinazione. Per creare una tabella di destinazione, è possibile eseguire il comando Transact-SQL seguente nel database AdventureWorks:

    CREATE TABLE [Person].[Address2](
        [AddressID] [int] NOT NULL,
        [City] [nvarchar](30) NOT NULL
    )
    
  7. Eseguire l'esempio.

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();

    }

}

Esempio di trasformazione sincrona a due output

In questo esempio viene illustrato un componente di trasformazione sincrona con due output. La trasformazione passa la colonna AddressID e converte la colonna City in lettere maiuscole. Se il nome della città è Redmond, indirizza la riga a un unico output e tutte le altre righe a un altro 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 in Progettazione SSIS. Questo output deve fornire i dati della tabella Person.Address del database di esempio AdventureWorks che contiene almeno le colonne AddressID e City.

  3. Aprire Editor trasformazione Script. Nella pagina Colonne di input selezionare le colonne AddressID e City. Contrassegnare la colonna City come di lettura/scrittura.

  4. Nella pagina Input e output creare un secondo output. Dopo aver aggiunto il nuovo output, assicurarsi di impostare il relativo oggetto SynchronousInputID sull'oggetto ID dell'input. Questa proprietà è già impostata sul primo output, creato per impostazione predefinita. Per ogni output, impostare la proprietà ExclusionGroup sullo stesso valore diverso da zero per indicare che le righe di input verranno suddivise tra due output che si escludono a vicenda. Non è necessario aggiungere colonne di output agli output.

  5. Rinominare l'input e gli output con nomi più descrittivi, ad esempio MyAddressInput, MyRedmondAddresses e MyOtherAddresses.

  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 due componenti di destinazione in cui sono previste le colonne AddressID e City, ad esempio una destinazione SQL Server, una destinazione file flat o il componente di destinazione di esempio illustrato in Creazione di una destinazione con il componente script. Connettere quindi ogni output della trasformazione a uno dei componenti di destinazione. Per creare tabelle di destinazione, è possibile eseguire un comando Transact-SQL simile al seguente (con nomi di tabella univoci) nel database AdventureWorks:

    CREATE TABLE [Person].[Address2](
        [AddressID] [int] NOT NULL,
        [City] [nvarchar](30) NOT NULL
    
  8. Eseguire l'esempio.

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();
        }

    }
}
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.