Domanda

Lasciami prefigurare questo dicendo che sono ancora un principiante quando si tratta di SSIS. Sto cercando di sostituire un processo di accesso MS attuale che ha 13 domande che vengono create in Excel e inviate via e -mail a un elenco di utenti.

Il mio pacchetto SSIS deve ottenere il nome del rapporto, elenco di dist e -mail, dati di report, creare un file CSV e quindi inviare un'e -mail per ognuno.

Ho creato quanto segue in SQL Server:

  1. una tabella con i report - ognuno ha un reportID
  2. Una tabella con gli indirizzi email degli utenti
  3. una tabella di join che collega l'utente a ciascun rapporto
  4. Ho creato un proc memorizzato quando passo nel reportID e restituisce l'elenco di dist e -mail e alcuni dettagli del report da utilizzare quando invio le mie e -mail
  5. Ho creato un proc memorizzato a cui ho superato il reportID. In cambio otterrò uno qualsiasi dei valori per quel rapporto. Ogni rapporto ha una query diversa che restituisce diverse colonne di dati.

Ho anche tentato di creare un pacchetto SSIS che segue:

  1. usando un Execute SQL Task Ottieni l'elenco degli ID report attivi
  2. un Foreach Container Loop impostato ADO Enumerator per loop tramite ogni ID report
  3. un Execute SQL Task Ciò restituirà i dettagli del mio report e l'elenco di dist e -mail per ciascun ID report.

Poi ho provato a posizionare un file Data Flow Task All'interno del mio ciclo e per eseguire il mio proc memorizzato per restituire i dati del report per ogni ID report ma sto ricevendo un messaggio di errore:

Error: SSIS Error Code DTS_E_OLEDBERROR.  An OLE DB error has occurred. 
Error code: 0x80040E55. An OLE DB record is available.  
Source: "Microsoft SQL Server Native Client 10.0"  Hresult: 0x80040E55  Description: "Column does not exist.". 

Immagino che questo errore sia perché le mie colonne non sono le stesse su ciascun rapporto. In tal caso, allora hai qualche suggerimento su come procedere?

Quali passi dovrei usare nel mio pacchetto SSIS per passare attraverso ogni rapporto? Devo creare un pacchetto SSIS separato per eseguire ogni rapporto?

Se riesco a eseguirlo in un unico pacchetto, devo creare un gestore di connessioni file flat per ciascuno dei miei rapporti CSV che genero?

È stato utile?

Soluzione

Penso che il tuo approccio sia solido, devi solo fare qualcosa di diverso nel passaggio 3. Penso sp_send_dbmail Potrebbe essere un'opzione (chiamalo tramite Attività SQL).

È possibile assegnare la tua query n. 6 al parametro @Query (@Query = "Esegui dbo.makereport @reportId = 10 ') e @allegato_query_result_as_file = 1 e, supponendo che tu abbia attivato la posta del database, invierà un'e -mail a destinatari con i risultati della domanda come CSV.

Usa le espressioni per impostare il TO, CC e BCC in base ai risultati della prima query e voilà, spam-o-matic.

Altri suggerimenti

Se i tuoi report hanno colonne diverse, avrai bisogno di un flusso di dati diverso per ciascuno di essi. Se vuoi ancora farlo nello stesso ciclo foreach, puoi provare a fare qualcosa come avere una variabile come "reportType" che è popolata quando si esegue il Execute SQL Task. Successivamente puoi indirizzare il flusso lì al flusso di dati corretto. La seguente immagine mostra un esempio di flusso condizionale:Conditional Data Flow

In questo tutorial, anche se avendo un obiettivo diverso, l'autore descrive come creare un flusso condizionale: http://www.simple-lalk.com/sql/ssis/xml-configuration-files-in-sql-server-integration-services/

Qui troverai maggiori informazioni sulle variabili: http://sqlfool.com/2009/08/getting-started-with-vaiables-in-ssis/

Sfortunatamente, SSIS richiede che i metadati della pipeline del flusso di dati siano impostati al momento della progettazione, quindi se si utilizza un'attività di flusso di dati, avrai bisogno di un'attività separata per ciascun rapporto.

È possibile aggirare la necessità di un'attività di flusso di dati separato e un gestore della connessione file per ciascun rapporto non utilizzando un flusso di dati. Invece è possibile utilizzare BCP (Programma di copia in blocco) per copiare i dati nel file senza necessità di pre-definire i metadati. BCP prenderà il set di risultati della procedura memorizzata e lo scaricherà nel file. Dustin Ryan ha un ottimo articolo su come farlo su Bidn. Ci sono alcuni casi in cui l'utilizzo del BCP in SSIS può essere la scelta migliore rispetto all'attività di flusso di dati se non sono necessarie trasformazioni, e questa è una di quelle volte.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top