Ssis variabile

mercoledì 21 maggio 2008 - 15.53

memmo77 Profilo | Expert

Salve a tutti. Ho fatto un dtsx che partendo da uno script t-sql riempie una tabella poi passo ad un dataflow apro il db con origine ole db e scrivo il contenuto della tabella in un file.html con destinazione file flat.
Poi passo per il controllo Attività script e scrivo il valore dell'html appena creato in una variabile che dovrei spedire per e-mail.

Il mio problema è che, la variabile che ho chiamato HTML è in ambito: attività script e non la vedo dall'oggetto mail. Non mi è chiaro come, dove e come usare le variabili per gli script.

Poi un altra cosa, è possibile spedire in modalità html il contenuto del controllo attività invia messaggi? Me li spedisce solo come testo

Un'altra domanda, quello che io genero in un dataflow, è possibile, collegando con la "freccetta verde" ad un altro dataflow, recuperarne il contenuto, o devo passare sempre per una variabile?


414x432 68Kb


Questo il codice dello script:

Dim PercorsoFile As String
Dim FileHtml As StreamReader
PercorsoFile = "c:\PROVA.HTM"
FileHtml = New StreamReader(PercorsoFile)
Dts.Variables("HTML").Value = FileHtml.ReadToEnd
Dts.TaskResult = Dts.Results.Success


Grazie

memmo77 Profilo | Expert

Perché questo post è stato segnalato come :
Thread senza risposta
Quasi subito dopo essere stato pubblicato?

alx_81 Profilo | Guru

>Salve a tutti.
Ciao!

>Ho fatto un dtsx che partendo da uno script t-sql
>riempie una tabella poi passo ad un dataflow apro il db con origine
>ole db e scrivo il contenuto della tabella in un file.html con
>destinazione file flat.
>Poi passo per il controllo Attività script e scrivo il valore
>dell'html appena creato in una variabile che dovrei spedire per
>e-mail.
Perchè passi da una tabella?
Se il t-sql ti produce già il messaggio HTML o il contenuto del messaggio stesso, basta usare un attivtà T-sql creando già l'HTML, tipo:

SELECT '<html><head>' + contenuto + '</head></html>' FROM ...

A quel punto il risultato lo salvi in una variabile che poi invii come contenuto della email.

>Il mio problema è che, la variabile che ho chiamato HTML è in
>ambito: attività script e non la vedo dall'oggetto mail. Non
>mi è chiaro come, dove e come usare le variabili per gli script.
Per il discorso dell'ambito, la variabile viene creata nell'oggetto che hai clickato o selezionato prima di crearla. Quindi, puoi sempre fare variabili di visibilità pacchetto clickando sullo stage e creandole. Ma seguirei la strada che ti ho indicato prima. Se non riesci ti farò un esempio nei prossimi post.
>
>Poi un altra cosa, è possibile spedire in modalità html il contenuto del controllo attività invia messaggi? Me li spedisce solo come testo
Supporta solo il testo. Per inviare come HTML usa questo link di riferimento
http://technet.microsoft.com/en-us/library/ms403365.aspx

>
>Un'altra domanda, quello che io genero in un dataflow, è possibile,
>collegando con la "freccetta verde" ad un altro dataflow,
>recuperarne il contenuto, o devo passare sempre per una variabile?
In questo caso direi che non ti serve, però, per risponderti, la freccetta verde tra un dataflow ed un altro è un VINCOLO DI PRECEDENZA, non trasporta dati.
Per far parlare tra loro i dataflow, devi passare da una variabile di visibilità superiore (o una tabella/file creati apposta per appoggiare i dati).

>Grazie
Di nulla!
Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

memmo77 Profilo | Expert

Allora, innanzitutto grazie mille della risposta. Sei stato chiarissimo.
Ora ho questo problema. Ho un'attività esegui sql. Dovrei parametrizzarla e alla fine valorizzare nella select una variabile che ho messo nel package.
E' possibile?
La select è la seguente.

DECLARE @FK_ID VARCHAR(5)
DECLARE @ANNO SMALLINT
DECLARE @MESE SMALLINT
DECLARE @FK_ID_STORICO SMALLINT
DECLARE @FK_ID_PROCEDURA SMALLINT
DECLARE @ANALISI SMALLINT
DECLARE @ANNO_APPO SMALLINT

SELECT @ANNO_APPO = ANNO
FROM [GLOBALRISK].[dbo].[T_ELABORAZIONI]
WHERE
FK_ID = @FK_ID
AND ANNO = @ANNO
AND MESE = @MESE
AND FK_ID_STORICO = @FK_ID_STORICO
AND FK_ID_PROCEDURA = @FK_ID_PROCEDURA

SET @ANNO_APPO = ISNULL(@ANNO_APPO,0)

IF @ANNO_APPO = 0
SET @ANALISI = 1
ELSE
SET @ANALISI = 0

Le variabili le ho messe nel mapping dei parametri e dovrei valorizzare alla fine la variabile @ANALISI. Metto un'immagine di come ho utilizzato le variabili nel mapping.

728x616 183Kb

alx_81 Profilo | Guru

>Allora, innanzitutto grazie mille della risposta. Sei stato chiarissimo.
di nulla!

>Ora ho questo problema. Ho un'attività esegui sql. Dovrei parametrizzarla
>e alla fine valorizzare nella select una variabile che ho messo
>nel package.
>E' possibile?
Sì, è possibile, ma non come proponi tu.
La sintassi OLEDB ti impone di utilizzare il ? come placeolder dei parametri. Nel tuo caso farei una query come questa:

SELECT CASE WHEN ISNULL(ANNO,0) = 0 THEN 1 ELSE 0 END AS ANALISI FROM [GLOBALRISK].[dbo].[T_ELABORAZIONI] WHERE FK_ID = ? AND ANNO = ? AND MESE = ? AND FK_ID_STORICO = ? AND FK_ID_PROCEDURA = ?

In questo modo hai ottenuto quello che ti serviva senza IF ridondanti.
Ora basta costruire il SSIS che riceva l'output come scalare e i parametri di input.
Prova a vedere se l'allegato può andare nel tuo caso. E' un modello. Adattalo come meglio credi, ma il principio è quello.
Ciao!


Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

memmo77 Profilo | Expert

Innanzi tutto rigrazie mille della risposta. Sono riuscito grazie al tuo esempio ad andare "avanti". Ora però mi sono bloccato su un altro aspetto.
Sono dentro un DataFlow e dopo una serie di cose ho aggiunto un componente script. E qui mi blocco . Come utilizzo le varibili a livello package dentro questo task?
Da attività script del package uso
Dts.Connections("FLUSSI").ConnectionString = Dts.Variables("NAME_FLUSSI").Value.ToString

Dal componente script?? Giuro che "tenterò" di non tormentarti +

Ancora mille grazie

alx_81 Profilo | Guru

>Innanzi tutto rigrazie mille della risposta. Sono riuscito grazie
>al tuo esempio ad andare "avanti". Ora però mi sono bloccato
>su un altro aspetto.
>Sono dentro un DataFlow e dopo una serie di cose ho aggiunto
>un componente script. E qui mi blocco . Come utilizzo le
>varibili a livello package dentro questo task?
>Da attività script del package uso
>Dts.Connections("FLUSSI").ConnectionString = Dts.Variables("NAME_FLUSSI").Value.ToString
Il modo con cui accedi alla collection delle variabili è corretto, però devi definirle nelle proprietà ReadOnlyVariables e ReadWriteVariables dello Script component:


638x625 28Kb


Ci sono però altre soluzioni, come definire la connectionstring del tuo datasource (che sembra di tipo file flat) tramite le expression:


1207x727 60Kb


>Ancora mille grazie
di nulla!

Visto che hai alcune domande sui SSIS, se vuoi, potresti dare un occhiata al mio blog, indicato nella firma..
ciao!
Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

memmo77 Profilo | Expert

hehehe già visitato il tuo sito ;), anzi complimenti e grazie per tutto quello che metti a disposizione.
Ora ti chiedo un altra cosa però (dimmelo se abuso :D)
Allora nella mia elaborazione ho bisogno di alcuni dati che si trovano su 3 tabelle diverse. Dovrei caricarle in memoria e "portarmele dietro"
Pensavo di fare una origine oledb con questa select:

SELECT 1 AS TIPO, COD_CAMPO AS COD_CAMPO, LUNGH AS LUNGH, NULL AS CODUIC, NULL AS CAMBIO, NULL AS ANNO, NULL AS MESE, NULL AS CARATTERE, NULL AS CODIFICA_IMPORTO
FROM T_DIZ_CAMPI
UNION
SELECT 2, NULL, NULL,CODUIC, CAMBIO,ANNO, MESE, NULL, NULL
FROM T_CAMBI
UNION
SELECT 3, NULL, NULL, NULL, NULL, NULL, NULL, CARATTERE, CODIFICA_IMPORTO
FROM T_DIZ_IMPORTI

in modo da avere un'unica tabella con dentro tutte le informazioni che mi servono, collevare l'origine oledb ad un datareader ... ma come riutilizzo nel codice degli script questo datareader? Non so se sono stato chiarissimo


ps. complimenti per le foto

alx_81 Profilo | Guru

> hehehe già visitato il tuo sito ;), anzi complimenti e grazie
>per tutto quello che metti a disposizione.
grazie
>Ora ti chiedo un altra cosa però (dimmelo se abuso :D)
non abusi

>in modo da avere un'unica tabella con dentro tutte le informazioni
>che mi servono, collevare l'origine oledb ad un datareader ...
ok, ma a cosa ti serve questo resultset? per comporre il contenuto della email?

>ps. complimenti per le foto
quelle del blog?

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

memmo77 Profilo | Expert

Allora, per le foto mi riferivo a quelle del tuo blog. Tempo fa piaceva anche a me scattarne parecchie a paesaggi etc (ps. in Irlanda c'ho fatto il viaggio di nozze ). Ora però le scatto tutte ai mie pargoli .
Bando alle "ciance". Visto che non abuso , ti faccio una nuova domanda .... preferisci che ti accetti questa e faccia un nuovo thread? Dimmelo.
Mi trovo in questa situazione:
Ho una tabella derivata con dentro:

ID_FLUSSO
IMPORTO
FORMULA_COMPLETA (questa è una formula del tipo "where campo=valore and, ...")

Sono "dentro" un DataFlow, con la formula devo collegarmi ad un altra tabella sul db, passare ad una select la mia where e, se questa è soddisfatta prendere gli importi che poi con un aggregazione andrò a sommare.
Mi chiedevo, come passo la mia where all'altra tabella? Pensavo di passare da un componente script e connettermi li al db costruendomi di volta in volta la select e se questa mi tornava un valore, aggiungere l'importo ad una colonna di output. Che ne dici? Mi sai consigliare una via + "indolore" .
Grazie mille ciao

alx_81 Profilo | Guru

>Allora, per le foto mi riferivo a quelle del tuo blog. Tempo
>fa piaceva anche a me scattarne parecchie a paesaggi etc (ps.
>in Irlanda c'ho fatto il viaggio di nozze ). Ora però le
>scatto tutte ai mie pargoli .
>Bando alle "ciance". Visto che non abuso , ti faccio una
>nuova domanda .... preferisci che ti accetti questa e faccia
>un nuovo thread? Dimmelo.
Direi di sì, perchè è un altro argomento.
Altrimenti chi cerca non trova
ciaoo!
Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

memmo77 Profilo | Expert

Allora, ho preso la strada dello script componet.
Prima cosa, è normale che se metto un punto di debug non mi si fermi?
Seconda cosa. Ho fatto una stored che ho testato prima da sql e da vb e funziona. L'ho richiamata da script component dentro il data flow col seguente codice:

Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
Dim _return As SqlClient.SqlParameter
Dim Comando As Data.SqlClient.SqlCommand
_return = New SqlClient.SqlParameter("RETURN", SqlDbType.Int)
_return.Direction = ParameterDirection.Output

Comando = New SqlClient.SqlCommand("SSIS_FLUSSO_CAMPI_CONTROLLO", CType(Me.Connections.CONN, SqlClient.SqlConnection))
Comando.CommandType = CommandType.StoredProcedure
Comando.Parameters.AddWithValue("@ID_FLUSSO", Row.IDFLUSSO)
Comando.Parameters.AddWithValue("@FORMULA_COMPLETA", Row.FORMULACOMPLETA)
Comando.Parameters.Add(_return)
Comando.ExecuteNonQuery()
If Convert.ToInt32(_return.Value) <> 0 Then
Row.NEWCODAGGR = Row.CODAGGR
Row.NEWIMPORTO = Row.IMPORTO
Else
Row.NEWCODAGGR = Row.CODAGGR
Row.NEWIMPORTO = 0
End If

End Sub

Questo L'errore che mi ritorna:

752x368 165Kb


Da cosa può dipendere? Grazie infinitamente. Ciao


Aggiungo una domanda alla domanda :D, sto modificando il post mentre vado avanti.
Allora, ho le mie belle colonne derivate. Devo scriverle su db facendo però un update, come faccio con l'oggetto Destinazione OLE DB non ci sono riuscito come posso fare?
Altra domanda le connessioni al db devono per forza avere come credenziali, la protezione integrata di windows? Se provo ad eseguire una insert su un db mi chiede quelle. Non c'è modo di passare utente e password?
RiririririririrGraaaazie

alx_81 Profilo | Guru

>Allora, ho preso la strada dello script componet.
>Prima cosa, è normale che se metto un punto di debug non mi si
>fermi?
Sì, devi usare il logging di SSIS e tracciare il comportamento (nello script --> Dts.Events.FireInformation(...) )

>Seconda cosa. Ho fatto una stored che ho testato prima da sql
>e da vb e funziona.
>Da cosa può dipendere? Grazie infinitamente. Ciao
Visto così non ti saprei dire, prova ad approfondire con debug.. perchè non vedo nulla di che..
>
>Devo scriverle su db facendo però un update, come faccio con l'oggetto Destinazione
>OLE DB non ci sono riuscito come posso fare?
non devi usare la destinazione, ma OLEDBCommand e impostare comando e parametri con i "?"

>Altra domanda le connessioni al db devono per forza avere come
>credenziali, la protezione integrata di windows? Se provo ad
>eseguire una insert su un db mi chiede quelle. Non c'è modo di
>passare utente e password?
No, se hai fatto l'utente SQL puoi usarlo eccome, unico problema, è che devi salvare le informazioni criptate con password (o con user key, ma poi le perdi se qualcun altro apre il pckage). E comunque, per quanto possibile, ti consiglio di utilizzare l'autenticazione integrata di windows.


--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

memmo77 Profilo | Expert

>Sì, devi usare il logging di SSIS e tracciare il comportamento (nello script --> Dts.Events.FireInformation(...) )
Quindi non posso debaggare direttamente il codice.

>Visto così non ti saprei dire, prova ad approfondire con debug.. perchè non vedo nulla di che..
MMMM ok provo, ma sembra quasi che non possa utilizzare oggetti net. Mi da l'errore che ti ho messo nell'immagine prima

>non devi usare la destinazione, ma OLEDBCommand e impostare comando e parametri con i "?"
Ok questo fatto e funziona ;)

>No, se hai fatto l'utente SQL puoi usarlo eccome, unico problema, è che devi salvare le informazioni criptate con password (o con user key, ma poi le >perdi >se qualcun altro apre il pckage). E comunque, per quanto possibile, ti consiglio di utilizzare l'autenticazione integrata di windows.
Non capisco cosa intendi per perdersi, se apre il package in progettazione intendi?

Di nuovo mille grazie . Ciao

alx_81 Profilo | Guru

>>No, se hai fatto l'utente SQL puoi usarlo eccome, unico problema, è che devi salvare le informazioni criptate con password (o con user key, ma poi le >perdi >se qualcun altro apre il pckage). E comunque, per quanto possibile, ti consiglio di utilizzare l'autenticazione integrata di windows.
>Non capisco cosa intendi per perdersi, se apre il package in
>progettazione intendi?
Quando hai delle informazioni sensibili (quali quelle delle credenziali sql), per non perderle in esecuzione, devi salvarle da qualche parte insieme al pacchetto. Quindi o salvi il pacchetto proteggendolo con una password, o utilizzi la protezione con la userkey, o usi winauth (best practice).
Se salvi con userkey, se un altro utente cerca di aprire o eseguire il ssis, perde le credenziali, poichè la userkey è diversa da quella usata per salvare il package.

Leggi qui:

DTSProtectionLevel Enumeration
http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dts.runtime.dtsprotectionlevel.aspx
>
>Di nuovo mille grazie . Ciao
Di nulla! Ciao!
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

memmo77 Profilo | Expert

Io questo ssis dovrei metterlo sulla macchina sql e richiamarlo da una procedura asp net. Se non ho capito male potrei lasciare al ssis la protezione integrata di windows , richiamare il ssis da sp net, per passare le variabili al package. Poi dovrebbe essere sql a gestire il ssis giusto e la protezione integrata? Sto facendo confusione?
Ps. per il momento non ho la + pallida idea di come richiamare il ssis da asp net . Hai qualche dritta? Grazie ciao

alx_81 Profilo | Guru

>Io questo ssis dovrei metterlo sulla macchina sql e richiamarlo
>da una procedura asp net.
E' necessario richiamarlo da asp.net? Non puoi schedularlo semplicemente con un JOB?
Da asp net, al massimo, puoi riempire una o più tabelle per preparare l'esecuzione del SSIS, ma proprio lanciarlo?

>Se non ho capito male potrei lasciare al ssis la protezione integrata di windows , richiamare il ssis
>da sp net, per passare le variabili al package. Poi dovrebbe
>essere sql a gestire il ssis giusto e la protezione integrata?
Il SSIS userà l'autenticazione integrata, è vero, ma non sarà lo stesso utente che hai utilizzato per lo sviluppo, bensì quello che gira sul servizio web (tipicamente, se non erro, l'utente ASPNET). Di conseguenza quell'utente deve essere sia una delle Login del server SQL (basta anche che faccia parte di un gruppo di login) sia un utente sul db, altrimenti non avrai alcun tipo di accesso.

>Ps. per il momento non ho la + pallida idea di come richiamare
>il ssis da asp net . Hai qualche dritta? Grazie ciao
Come ti ripeto, cerchiamo soluzioni alternative..
Potresti pensare di farti una coda e far girare un JOB schedulato ogni TOT che scoda le richieste, a mo' di servizio.
Chiamarlo da asp.net non è per nulla ortodosso..

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

memmo77 Profilo | Expert

Quindi se devo passare delle variabili al pacchetto ssis come faccio? Le devo scrivere per dire su una tabella di appoggio e il ssis devo in qualche modo dirgli di prenderle da li?
Io in pratica le variabili che devo passargli le ho su codice asp net dovrei richiamare il siss, un po' come faccio con i report, passandogli i miei parameters
MMMMM misà che mi tocca cambiare strada

alx_81 Profilo | Guru

>Quindi se devo passare delle variabili al pacchetto ssis come
>faccio? Le devo scrivere per dire su una tabella di appoggio
>e il ssis devo in qualche modo dirgli di prenderle da li?
>Io in pratica le variabili che devo passargli le ho su codice
>asp net dovrei richiamare il siss, un po' come faccio con i report,
>passandogli i miei parameters
Basta che nella "coda" vai a mettere i parametri che devi passare per quella chiamata. Poi il SSIS gira, scoda e prende dal record letto i parametri da utilizzare. Se al contrario l'operazione e' una sola o sono poche e non pesanti, puoi permetterti di aggiungere un task nel SSIS che va a leggere preventivamente i parametri. Se sono valori passati dall'utente, ovviamente te li devi segnare in coda e poi andarli a leggere dal package.
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5