Preparare l'esecuzione di una query per i dati delle modifiche

Si applica a:SQL Server SSIS Integration Runtime in Azure Data Factory

Nel flusso di controllo di un pacchetto di Integration Services per l'esecuzione di un caricamento incrementale dei dati delle modifiche, la terza e ultima attività consiste nel preparare l'esecuzione di una query per i dati delle modifiche e nell'aggiungere un'attività Flusso di dati.

Nota

La seconda attività per il flusso di controllo consiste nel verificare che i dati delle modifiche per l'intervallo selezionato siano pronti. Per altre informazioni su questa attività, vedere Determinare se i dati delle modifiche sono pronti. Per una descrizione del processo complessivo di progettazione del flusso di controllo, vedere Change Data Capture (SSIS).

Considerazioni sulla progettazione

Per recuperare i dati delle modifiche, è necessario chiamare una funzione Transact-SQL con valori di tabella che accetti gli endpoint dell'intervallo come parametri di input e restituisca i dati delle modifiche per l'intervallo specificato. Un componente di origine nel flusso di dati chiama questa funzione. Per informazioni su questo componente di origine, vedere Recuperare e comprendere i dati delle modifiche.

I componenti di origine di Integration Services usati più di frequente, incluse l'origine OLE DB, l'origine ADO e l'origine ADO NET, non possono derivare informazioni sui parametri per una funzione valutata a livello di tabella. Pertanto, la maggior parte delle origini dati non può chiamare direttamente una funzione parametrizzata.

Per passare i parametri di input alla funzione, sono disponibili due opzioni di progettazione:

  • Assembla la query parametrica come una stringa. È possibile utilizzare un'attività Script o un'attività Esegui SQL per assemblare una stringa SQL dinamica con valori di parametro specificati a livello di codice nella stringa. È quindi possibile archiviare tale stringa in una variabile del pacchetto e utilizzarla per impostare la proprietà SqlCommand di un componente di origine. Questo approccio ha esito positivo perché il componente di origine non richiede più informazioni sui parametri.

    Nota

    Uno script precompilato è soggetto a un overhead minore rispetto a un'attività Esegui SQL.

  • Usare un wrapper parametrizzato. In alternativa, è possibile creare una stored procedure con parametri come involucro che richiama la funzione con valori di tabella con parametri. Questo approccio ha esito positivo perché un componente di origine è in grado di derivare correttamente le informazioni sui parametri per una stored procedure.

In questo argomento viene utilizzata la prima opzione di progettazione, assemblando una query con parametri come stringa.

Preparazione della query

Prima che sia possibile concatenare i valori dei parametri di input in una singola stringa di query, è necessario configurare le variabili del pacchetto necessarie per la query.

Per configurare le variabili del pacchetto

  • Nella finestra Variabili di SQL Server Data Tools (SSDT) creare una variabile con un tipo di dati stringa per memorizzare la stringa di query restituita dall'attività Esegui SQL.

    In questo esempio viene utilizzato il nome di variabile SqlDataQuery.

Dopo avere creato la variabile del pacchetto, è possibile utilizzare un'attività Script o un'attività Esegui SQL per concatenare i valori dei parametri di input. Nelle due procedure seguenti viene descritto come configurare tali componenti.

Per utilizzare un'attività Script per concatenare la stringa di query

  1. Nella scheda Flusso di controllo, aggiungere un'attività script al pacchetto dopo il contenitore Ciclo For e collegare il contenitore Ciclo For all'attività.

    Nota

    In questa procedura si presuppone che il pacchetto esegua un caricamento incrementale da una singola tabella. Se il pacchetto esegue il caricamento da più tabelle e ha un pacchetto padre con più pacchetti figlio, questa attività viene aggiunta come primo componente a ciascun pacchetto figlio. Per altre informazioni, vedere Eseguire un caricamento incrementale di più tabelle.

  2. Nell'Editor attività script, nella pagina Script, selezionare le opzioni seguenti:

    1. Per ReadOnlyVariables, selezionare User::DataReady, User::ExtractStartTime e User::ExtractEndTime.

    2. Per ReadWriteVariablesselezionare User::SqlDataQuery nell'elenco.

  3. Nell'Editor attività script, nella pagina Script, fare clic su Modifica script per aprire l'ambiente di sviluppo dello script.

  4. Nella routine Main immettere uno dei segmenti di codice seguenti:

    • Se si utilizza il linguaggio di programmazione C#, immettere le righe di codice seguenti:

      int dataReady;  
      System.DateTime extractStartTime;  
      System.DateTime extractEndTime;  
      string sqlDataQuery;  
      
      dataReady = (int)Dts.Variables["DataReady"].Value;  
      extractStartTime = (System.DateTime)Dts.Variables["ExtractStartTime"].Value;  
      extractEndTime = (System.DateTime)Dts.Variables["ExtractEndTime"].Value;  
      
      if (dataReady == 2)  
        {  
        sqlDataQuery = "SELECT * FROM CDCSample.uf_Customer('" + string.Format("{0:yyyy-MM-dd hh:mm:ss}", extractStartTime) + "', '" + string.Format("{0:yyyy-MM-dd hh:mm:ss}", extractEndTime) + "')";  
        }  
      else  
        {  
        sqlDataQuery = "SELECT * FROM CDCSample.uf_Customer(null" + ", '" + string.Format("{0:yyyy-MM-dd hh:mm:ss}", extractEndTime) + "')";  
        }  
      
      Dts.Variables["SqlDataQuery"].Value = sqlDataQuery;  
      

      - o -

    • Se si usa il linguaggio di programmazione Visual Basic, immettere le righe di codice seguenti:

      Dim dataReady As Integer  
      Dim extractStartTime As Date  
      Dim extractEndTime As Date  
      Dim sqlDataQuery As String  
      
      dataReady = CType(Dts.Variables("DataReady").Value, Integer)  
      extractStartTime = CType(Dts.Variables("ExtractStartTime").Value, Date)  
      extractEndTime = CType(Dts.Variables("ExtractEndTime").Value, Date)  
      
      If dataReady = 2 Then  
        sqlDataQuery = "SELECT * FROM CDCSample.uf_Customer('" & _  
            String.Format("{0:yyyy-MM-dd hh:mm:ss}", extractStartTime) & _  
            "', '" & _  
            String.Format("{0:yyyy-MM-dd hh:mm:ss}", extractEndTime) & _  
            "')"  
      Else  
        sqlDataQuery = "SELECT * FROM CDCSample.uf_Customer(null" & _  
            ", '" & _  
            String.Format("{0:yyyy-MM-dd hh:mm:ss}", extractEndTime) & _  
            "')"  
      End If  
      
      Dts.Variables("SqlDataQuery").Value = sqlDataQuery  
      
      
  5. Lasciare la riga di codice predefinita, che restituisce DtsExecResult.Success dall'esecuzione dello script.

  6. Chiudere l'ambiente di sviluppo dello script e l'Editor attività script.

Per utilizzare un'attività Esegui SQL per concatenare la stringa di query

  1. Nella scheda Flusso di controllo aggiungere un'attività Esegui SQL al pacchetto dopo il contenitore Ciclo For e connettere tale contenitore all'attività.

    Nota

    In questa procedura si presuppone che il pacchetto esegua un caricamento incrementale da una singola tabella. Se il pacchetto esegue il caricamento da più tabelle e ha un pacchetto padre con più pacchetti figlio, questa attività viene aggiunta come primo componente a ciascun pacchetto figlio. Per altre informazioni, vedere Eseguire un caricamento incrementale di più tabelle.

  2. Nell'Editor attività Esegui SQL, nella pagina Generale, selezionare le opzioni seguenti:

    1. Per il ResultSet, selezionare Riga singola.

    2. Configurare una connessione valida al database di origine.

    3. Per SQLSourceType, selezionare Input diretto.

    4. Per SQLStatementimmettere l'istruzione SQL seguente:

      declare @ExtractStartTime datetime,  
      @ExtractEndTime datetime,   
      @DataReady int  
      
      select @DataReady = ?,   
      @ExtractStartTime = ?,   
      @ExtractEndTime = ?  
      
      if @DataReady = 2  
      select N'select * from CDCSample.uf_Customer'  
      + N'('''+ convert(nvarchar(30),@ExtractStartTime,120)  
      + ''', '''  
      + convert(nvarchar(30),@ExtractEndTime,120) + ''') '   
      as SqlDataQuery  
      else  
      select N'select * from CDCSample.uf_Customer'  
      + N'(null, '''  
      + convert(nvarchar(30),@ExtractEndTime,120)  
      + ''') '  
      as SqlDataQuery  
      
      

      Nota

      In questo esempio la clausola else genera una query per il caricamento iniziale dei dati delle modifiche passando un valore Null per la data e l'ora di inizio. Questo esempio non si applica a uno scenario in cui le modifiche apportate prima dell'attivazione di Change Data Capture devono essere caricate anche nel data warehouse.

  3. Nella pagina Mapping dei parametri dell'Editor attività Esegui SQL, eseguire la seguente mappatura:

    1. Eseguire il mapping tra la variabile DataReady e il parametro 0.

    2. Eseguire il mapping tra la variabile ExtractStartTime e il parametro 1.

    3. Eseguire il mapping tra la variabile ExtractEndTime e il parametro 2.

  4. Nella pagina Set di risultati dell'Editor attività Esegui SQL, associare il Nome risultato alla variabile SqlDataQuery.

    Il nome del risultato è il nome della singola colonna restituita, ovvero SqlDataQuery.

Nelle procedure precedenti è stata configurata un'attività per la preparazione di una stringa di query con valori stringa specificati a livello di codice per i parametri di input. Il codice seguente rappresenta un esempio di tale stringa di query:

select * from CDCSample. uf_Customer('2007-06-11 14:21:58', '2007-06-12 14:21:58')

Aggiunta di un'attività del flusso di dati

L'ultimo passaggio nella progettazione del flusso di controllo per il pacchetto consiste nell'aggiungere un'attività Flusso di dati.

Per aggiungere un'attività Flusso di dati e completare il flusso di controllo

  • Nella scheda Flusso di controllo, aggiungi un'attività di flusso di dati e collega l'attività che ha concatenato la stringa di query.