Concettualmente, l'aspetto della tua soluzione è eseguire la query di origine per generare il set di risultati. Memorizzalo in una variabile e quindi dovrai scorrere quei risultati e per ogni riga, ti consigliamo di chiamare la tua procedura memorizzata con il valore di quella riga e inviare i risultati in un nuovo file Excel.
Immagino che il tuo pacco sia simile a questo
Un'attività Esegui SQL, denominata "SQL Load Recordset", collegata a un Foreach Loop Container, denominata "FELC Shred Recordset". Nidificato al suo interno ho un'attività del file system, denominata "Modello di copia FST" che è una precedenza per un'attività del flusso di dati, denominata "Genera output DFT".
Configura
Dato che sei un principiante, cercherò di spiegare in dettaglio. Per risparmiarti qualche seccatura, prendi una copia di BIDSHelper. È uno strumento gratuito e open source che migliora l'esperienza di progettazione in BIDS/SSDT.
Variabili
Fare clic sullo sfondo del flusso di controllo. Con nulla selezionato, fare clic con il pulsante destro del mouse e selezionare Variabili. Nella nuova finestra che si apre, fai clic sul pulsante che crea una Nuova variabile 4 volte. Il motivo per cui non si fa clic su nulla è che fino a SQL Server 2012, il comportamento predefinito della creazione di variabili consiste nel crearle nell'ambito dell'oggetto corrente. Ciò ha comportato la perdita di molti capelli sia per gli sviluppatori nuovi che per quelli esperti. I nomi delle variabili fanno distinzione tra maiuscole e minuscole, quindi tienilo presente.
- Rinomina variabile in RecordSet. Cambia il Tipo di dati da Int32 a Oggetto
- Rinomina variabile1 in ParameterValue. Cambia il tipo di dati da Int32 a String
- Rinomina la variabile2 in TemplateFile. Modificare il tipo di dati da Int32 a String. Imposta il valore sul percorso del tuo file Excel di output. Ho usato C:\ssisdata\ShredRecordset.xlsx
- Rinomina la variabile 4 in OutputFileName. Modificare il tipo di dati da Int32 a String. Qui faremo qualcosa di leggermente avanzato. Fare clic sulla variabile e premere F4 per visualizzare la finestra Proprietà. Modificare il valore di EvaluateAsExpression su True. In Expression, impostalo su
"C:\\ssisdata\\ShredRecordset." + @[User::ParameterValue] + ".xlsx"
(o qualunque sia il tuo file e percorso). Ciò che fa è configurare una variabile da modificare quando il valore di ParameterValue cambia. Questo aiuta a garantire che otteniamo un nome file univoco. Puoi modificare la convenzione di denominazione secondo necessità. Nota che devi eseguire l'escape del\
ogni volta che sei in un'espressione.
Gestione connessioni
Ho ipotizzato che tu stia utilizzando un gestore di connessione OLE DB. Il mio si chiama FOO. Se stai usando ADO.NET i concetti saranno simili ma ci saranno sfumature relative ai parametri e simili.
Avrai anche bisogno di un secondo Connection Manager per gestire Excel. Se SSIS è capriccioso sui tipi di dati, Excel è completamente psicotico-pugnala-ti-alla-schiena-con-una-forchetta-mentre-dormi sui tipi di dati. Aspetteremo e lasceremo che il flusso di dati crei effettivamente questo Connection Manager per garantire che i nostri tipi siano buoni.
Richiesta di origine al set di risultati
Il SQL Load Recordset
è un'istanza dell'attività Esegui SQL. Qui ho una semplice query per imitare la tua fonte.
SELECT 'aq' AS parameterValue
UNION ALL SELECT 'dr'
UNION ALL SELECT 'tb'
Quello che è importante notare nella scheda Generale è che ho cambiato il mio ResultSet da None
a Full result set
. In questo modo, la scheda Set di risultati da disattivata diventa utilizzabile.
Puoi notare che ho assegnato il Nome variabile alla variabile che abbiamo creato sopra (Utente::RecordSet) e Il nome del risultato è 0
. Questo è importante come valore predefinito, NewResultName
non funziona.
Record di distruzione FELC
Prendi un Foreach Loop Container e lo useremo per "distruggere" i risultati che sono stati generati nel passaggio precedente.
Configura l'enumeratore come Foreach ADO Enumerator
Usa User::RecordSet
come variabile di origine dell'oggetto ADO. Seleziona rows in the first table
come modalità di enumerazione
Nella scheda Mappature variabili, dovrai selezionare la tua variabile User::ParameterValue
e assegnargli l'indice di 0. Ciò comporterà l'assegnazione dell'elemento zerotth nell'oggetto recordset alla variabile ParameterValue. È importante che tu abbia un accordo sul tipo di dati poiché SSIS non eseguirà conversioni implicite qui.
Modello di copia FST
Questa è un'attività del file system. Copieremo il nostro modello di file Excel in modo da avere un file di output ben denominato (contenente il nome del parametro). Configuralo come
- IsDestinationPathVariable:True
- Variabile di destinazione:Utente::OutputFileName
- SovrascriviDestinazione:Vero
- Operazione:copia file
- IsSourcePathVariable:True
- SourceVariable:User::TemplateFile
Genera output DFT
Questa è un'attività di flusso di dati. Presumo che tu stia semplicemente scaricando i risultati direttamente in un file, quindi avremo solo bisogno di un'origine OLE DB e di una destinazione Excel
OLEDB dbo_storedProcedure1
È qui che i tuoi dati vengono estratti dal tuo sistema di origine con il parametro che abbiamo distrutto nel flusso di controllo. Scriverò la mia domanda qui e userò il ?
per indicare che ha un parametro.
Cambia la tua modalità di accesso ai dati in "Comando SQL" e nel testo del comando SQL disponibile, inserisci la tua query
EXECUTE dbo.storedProcedure1 ?
Faccio clic sul pulsante Parametri... e lo compilo come mostrato
- Parametri:@parameterValue
- Variabili:Utente::ParameterValue
- Direzione parametri:input
Collegare una destinazione Excel all'origine OLE DB. Fare doppio clic e nella sezione Gestione connessioni di Excel, fare clic su Nuovo... Determina se hai bisogno del formato 2003 o 2007 (.xls vs .xlsx) e se vuoi che il tuo file abbia righe di intestazione. Per il percorso del file, inserisci lo stesso valore che hai utilizzato per la variabile @User::TemplatePath e fai clic su OK.
Ora dobbiamo popolare il nome del foglio Excel. Fare clic sul pulsante Nuovo... e potrebbe abbaiare che non ci sono informazioni sufficienti sui tipi di dati di mappatura. Non preoccuparti, è semi-standard. Apparirà quindi una definizione di tabella simile a
CREATE TABLE `Excel Destination` (
`name` NVARCHAR(35),
`number` INT,
`type` NVARCHAR(3),
`low` INT,
`high` INT,
`status` INT
)
Il nome della "tabella" sarà il nome del foglio di lavoro o, precisamente, il set di dati denominato nel foglio di lavoro. Ho creato il mio Sheet1 e ho fatto clic su OK. Ora che il foglio esiste, selezionalo nel menu a discesa. Ho scelto Sheet1$ come nome del foglio di destinazione. Non sono sicuro che faccia la differenza.
Fai clic sulla scheda Mapping e le cose dovrebbero essere mappate automaticamente correttamente, quindi fai clic su OK.
Finalmente
A questo punto, se eseguissimo il pacchetto, sovrascriverebbe ogni volta il file modello. Il segreto è che dobbiamo dirlo a Excel Connection Manager
abbiamo appena fatto in modo che non debba avere un nome codificato.
Fare clic una volta su Excel Connection Manager nella scheda Connection Manager. Nella finestra Proprietà, trova le Expressions
sezione e fai clic sui puntini di sospensione ...
Qui configureremo la proprietà ExcelFilePath
e l'espressione che useremo è@[User::OutputFileName]
Se le tue icone e simili hanno un aspetto diverso, è prevedibile. Ciò è stato documentato utilizzando SSIS 2012. Il tuo flusso di lavoro sarà lo stesso nel 2005 e nel 2008/2008R2 solo la skin è diversa.
Se esegui questo pacchetto e non si avvia nemmeno e c'è un errore su ACE 12 o Jet 4.0 qualcosa non disponibile, allora sei su una macchina a 64 bit e devi dire a BIDS/SSDT che vuoi eseguire a 32 bit modalità.
Assicurati che il valore Run64BitRuntime sia False
. Questa impostazione del progetto può essere trovata facendo clic con il pulsante destro del mouse sul progetto, espandi le proprietà di configurazione e sarà un'opzione in Debug.
Ulteriori letture
Un altro esempio di distruzione di un oggetto recordset può essere trovato in Come automatizzare l'esecuzione di una procedura memorizzata con un pacchetto SSIS?