Store procedure?

martedì 12 maggio 2009 - 17.05

sergino Profilo | Newbie

Ciao a tutti,
ho bisogno del vostro aiuto – sto muovendo i primi passi con SQL
dovrei aggiornare un campo della mia tabella user_object con dei valori che mi vengono passi in un file di testo.
Quello che avrei in mente è quello di importare il file di testo in una tabella temporanea, eseguire una join tra la mia tabella temporanea e user_oject e procedere con l’aggiornamento del campo con il valore preso dalla tabella temporanea.
Se eseguissi passo per passo, sarebbe semplice credo.
Ma come posso fare per automatizzare il tutto?

Ciao e grazie mille!
sergio

alx_81 Profilo | Guru

>Ciao a tutti,
ciao

>ho bisogno del vostro aiuto – sto muovendo i primi passi con SQL
>dovrei aggiornare un campo della mia tabella user_object con
>dei valori che mi vengono passi in un file di testo.
>Quello che avrei in mente è quello di importare il file di testo
>in una tabella temporanea, eseguire una join tra la mia tabella
>temporanea e user_oject e procedere con l’aggiornamento del campo
>con il valore preso dalla tabella temporanea.
>Se eseguissi passo per passo, sarebbe semplice credo.
>Ma come posso fare per automatizzare il tutto?
Ci sono varie strade:

1) usare la bcp utility per importare i tuoi dati e poi effettuare una UPDATE JOIN
http://msdn.microsoft.com/en-us/library/ms162802.aspx
2) creare un SSIS di importazione dati senza passare da una temporanea, effettuando direttamente l'aggiornamento sulla tabella di destinazione
3) importare i dati con il wizard di management studio (che non fa altro che creare un SSIS al volo) e poi effettuare l'UPDATE JOIN con i dati importati
4) usare la funzione OPENROWSET per caricare direttamente il tuo file su tabella
http://msdn.microsoft.com/en-us/library/ms162802.aspx

fai attenzione, che per le versioni express di sql server 2005 non è possibile fare riferimento al punto 2 e 3.

>Ciao e grazie mille!
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

sergino Profilo | Newbie

ciao Alex,

grazie mille.
ho scelto l'opzione 2 e ci sto provando:


2) creare un SSIS di importazione dati senza passare da una temporanea, effettuando direttamente l'aggiornamento sulla tabella di destinazione

dunque: il primo step nel control flow che ho creato è un data flow task - dove vado a definire il file di testo che devo importare per poi poter effettuare l'update sulla tabella di destinazione. Corretto?

Poi penso che il secondo step sia Execute SQL task - dove vorrei specificare la query SQL. Solo che qui mi perdo: come posso dire far si che venga considerato il campo del file importato nello step precedente, se non ho nessuna tabella?

ciao e grazie!!!
sergio

alx_81 Profilo | Guru

>ciao Alex,
ciao

>2) creare un SSIS di importazione dati senza passare da una temporanea,
>effettuando direttamente l'aggiornamento sulla tabella di destinazione

>dunque: il primo step nel control flow che ho creato è un data
>flow task - dove vado a definire il file di testo che devo importare
>per poi poter effettuare l'update sulla tabella di destinazione.
>Corretto?

>Poi penso che il secondo step sia Execute SQL task - dove vorrei
>specificare la query SQL. Solo che qui mi perdo: come posso dire
>far si che venga considerato il campo del file importato nello
>step precedente, se non ho nessuna tabella?
no, fai tutto nel dataflow. source su flat file, definito nel connection manager, lookup che controlla se esiste o meno il record. In caso di match update con oledbcommand transformation, in caso di no match, insert tramite oledb destination task.

--

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

sergino Profilo | Newbie

ancora io :-(

sto definendo il mapping nel lookuo trasformation editor.
nel tab Reference table ho selezionato la mia tabella su db

nel tab columns - sto cercando di mettere in relazione i campo per il lookup: u_user_id - ma ho l'errore qui di seguito
il campo della tabella è nvarchar

TITLE: Microsoft Visual Studio
------------------------------

The following columns cannot be mapped:

[u_user_id, u_user_id]

One or more columns do not have supported data types, or their data types do not match.

------------------------------
BUTTONS:

OK
------------------------------

come posso risolvere?
thanks!
sergio

alx_81 Profilo | Guru

>One or more columns do not have supported data types, or their
>data types do not match.
>come posso risolvere?
eh devi fare in modo che il tipo che definisci nel file e quello della tabella siano IDENTICI.
controlla le colonne di output del flat file connection manager e fai in modo che il tipo sia uguale a quello che hai nella tabella.
Ad esempio se sulla tab è INT, su ssis devi mettere four byte signed integer.
Altrimenti non fa match.

--

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

sergino Profilo | Newbie

sono una frana... lo so.
risolto il problema del tipo dati, sono alle prese con l'update della tabella. (l'insert non è necessario) con l'ole db command
il lookup sul campo u_user_id viene fatto - ora devo aggiornare il campo "flag" per ogni record per cui il lookup è verificato.
non capisco come posso creare lo statement di update SQL - se in realtà ho solo la mia tabella. Non so proprio come fare :-(
sergio

sergino Profilo | Newbie

ciao Alessandro,
hai avuto modo di guardare il mio ultimo posto?
non riesco a creare lo statement SQL. Mi daresti una mano?
grazie milleeeeee
sergio

sergino Profilo | Newbie

il problema l'ho anche nel configurare il connection manager:
TITLE: Package Validation Error
------------------------------

Package Validation Error

------------------------------
ADDITIONAL INFORMATION:

Error at Data Flow Task [OLE DB Command [1131]]: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80040E0C.
An OLE DB record is available. Source: "Microsoft SQL Native Client" Hresult: 0x80040E0C Description: "Command text was not set for the command object.".

Error at Data Flow Task [DTS.Pipeline]: "component "OLE DB Command" (1131)" failed validation and returned validation status "VS_ISBROKEN".

Error at Data Flow Task [DTS.Pipeline]: One or more component failed validation.

Error at Data Flow Task: There were errors during task validation.

(Microsoft.DataTransformationServices.VsIntegration)

------------------------------
BUTTONS:

OK
------------------------------

sergio

alx_81 Profilo | Guru

>il problema l'ho anche nel configurare il connection manager:
Ma che problema hai? Non riesci a scrivere lo statement SQL? Non riesci a creare l'update? Non conosci la sintassi?
--

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

sergino Profilo | Newbie

ciao Alex, hai ragione, sono stato confusionario.
ho essenzialmente due problemi:

1 - non riesco a creare lo statement SQL ,non conoscendo la sintassi corretta.
2 - nel configurare il connection manager (nel post precedente ho riportato l'errore)

ciao, grazie e scusami tanto
sergio

alx_81 Profilo | Guru

>1 - non riesco a creare lo statement SQL ,non conoscendo la sintassi
>corretta.

UPDATE TuaTabella SET flag = ? WHERE Chiave = ?

poi, posizionalmente, nel column mapping, passi quello che ti arriva dall'output del lookup

--

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

sergino Profilo | Newbie

grazie mille per la sintassi Alex.
purtroppo il probema sul connection manager persiste. Utilizzo sempre la stessa connessione che utilizzo nel lookup - solo che qui non funziona:

TITLE: Package Validation Error
------------------------------

Package Validation Error

------------------------------
ADDITIONAL INFORMATION:

Error at Data Flow Task [OLE DB Command [1131]]: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80040E0C.
An OLE DB record is available. Source: "Microsoft SQL Native Client" Hresult: 0x80040E0C Description: "Command text was not set for the command object.".

Error at Data Flow Task [DTS.Pipeline]: "component "OLE DB Command" (1131)" failed validation and returned validation status "VS_ISBROKEN".

Error at Data Flow Task [DTS.Pipeline]: One or more component failed validation.

Error at Data Flow Task: There were errors during task validation.

(Microsoft.DataTransformationServices.VsIntegration)

------------------------------
BUTTONS:

OK
------------------------------

cosa potrebbe essere?

scusami e grazie
sergio

alx_81 Profilo | Guru

>cosa potrebbe essere?
"Command text was not set for the command object."
Hai impostato correttamente l'OLEDB Command?
nella parte del connection manager, nell'editor, c'è la proprietà del command text..
devi metterci l'update.


--

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

sergino Profilo | Newbie

ciao Alex, purtroppo non trovo il command text nel connection manager.
nell'immagine, quello che vedo.
dove lo trovo?

grazieeeeeeeeee

1190x662 55Kb

sergio

alx_81 Profilo | Guru

>ciao Alex, purtroppo non trovo il command text nel connection
>manager.
>nell'immagine, quello che vedo.
>dove lo trovo?
Tab COMPONENT PROPERTIES, è l'ultima riga..

cerca di leggere di più i Books On Line
Puoi partire da qui: http://technet.microsoft.com/en-us/library/ms141773.aspx

--

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

sergino Profilo | Newbie

buongiorno Alex,

hai perfettamente ragione.
finalmente sono riusciuto (o meglio, sei riuscito!) ad effettuare l'aggiornamento della tabella.
però, ho provato ad aggiungere nel file di testo, un record non presente nella tabella. Il package si blocca sul lookup - in effetti non c'è match. Non è possibile prevedere anche questo scenario - far aggiornare solamente i record dove il lookup è verificato e scartare i record non "matchati"?

thanks!
sergio

alx_81 Profilo | Guru

>però, ho provato ad aggiungere nel file di testo, un record non
>presente nella tabella. Il package si blocca sul lookup - in
>effetti non c'è match. Non è possibile prevedere anche questo
>scenario - far aggiornare solamente i record dove il lookup è
>verificato e scartare i record non "matchati"?
che versione hai di SSIS? 2005? 2008?

>thanks!
de che

--

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

sergino Profilo | Newbie

2005!

sergio

sergino Profilo | Newbie

ciao Alex,
forse ho risolto, ma magari quello che ho fatto non va bene.
Nell'editor del lookup, ho configurato l'error output come "ignore failure" .
Il package termina correttamente e la tabella viene aggiornata.

E' giusto quello che ho fatto?

grazie mille
ciao
sergio

alx_81 Profilo | Guru

>forse ho risolto, ma magari quello che ho fatto non va bene.
>Nell'editor del lookup, ho configurato l'error output come "ignore
>failure" .
>E' giusto quello che ho fatto?
direi di no, perchè l'ignore non ti permette di gestire la riga che non matcha.
piuttosto la soluzione potrebbe essere questa:

- imposti l'error output indicando "redirect row"
- l'errore è il no match e quindi lo fai andare in una destinazione (no match, insert)
- la freccina verde all'interno dell'oledbcommand (con update)

così gestisci l'update/insert.

La soluzione due può essere:

- metto tutti i dati letti in una tabella di appoggio
- faccio update dove c'è join tra la tua tabella di destinazione e quella di appoggio (per chiave)
- faccio un dataflow dove inserisco dritti i record che non sono il join tra la tua tabella di destinazione e quella di appoggio (per chiave)

scegli tu
--

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

sergino Profilo | Newbie

ho creato un nuovo data flow destionation (flat file) collegato con la freccia rossa il look up error Output.
ho fatto girare il package, mi aggiorna le righe per cui c'è la Join, e mi esporta in un file di testo le righe non matchate.

Giusto?
sergio

alx_81 Profilo | Guru

>ho creato un nuovo data flow destionation (flat file) collegato
>con la freccia rossa il look up error Output.
>ho fatto girare il package, mi aggiorna le righe per cui c'è
>la Join, e mi esporta in un file di testo le righe non matchate.
>
>Giusto?
direi di sì, anche se in realtà devi vedere che sia il risultato che ti aspetti

--

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

sergino Profilo | Newbie

sembra di is

ora vorrei far si, che se all'interno della cartella da cui viene prelevato il file ci sono più file, vengano tutti processati, sempre dallo stesso data flow.
ho inserito il data flow all'interno dell'item Foreach Loop Container solo che non capisco:
all'interno del Foreach Loop Container posso stabilire in che cartella guardare e il nome del file, usando l'asterisco (tab collection).
ma all'interno del dataflow, la connessione prevedere il nome specifico del file
come può il Foreach Loop Container passare l'informazione al dataflow di processare tutti i file il cui nome, ad esempio, comincia con test*

grazie!
sergio

sergino Profilo | Newbie

http://msdn.microsoft.com/en-us/library/ms169800.aspx

aspetta che ci provo :-)
sergio

alx_81 Profilo | Guru

>http://msdn.microsoft.com/en-us/library/ms169800.aspx
>
>aspetta che ci provo :-)
devi assegnare nella sezione VARIABLE MAPPINGS il map dell'elemento della collezione in posizione iesima ad una variabile, che poi usi per configurare il connection manager del flat file.

--

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

sergino Profilo | Newbie

dunque, ho eseguito passo passo quello che dice il sito:

1 Click Variable Mappings.
2 On the Variable Mappings page, in the Variable column, click the empty cell and select <New Variable…>.
3 In the Add Variable dialog box, for Name, type varFileName.

e funziona.
sinceramente non ho capito cos'ho fatto :-(
sergio

alx_81 Profilo | Guru

>dunque, ho eseguito passo passo quello che dice il sito:
>
>1 Click Variable Mappings.
>2 On the Variable Mappings page, in the Variable column, click
>the empty cell and select <New Variable…>.
>3 In the Add Variable dialog box, for Name, type varFileName.
>
>e funziona.
>sinceramente non ho capito cos'ho fatto :-(
ad ogni ciclo del for each hai valorizzato con l'n-simo valore una variablile.
Nulla più..

--

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

sergino Profilo | Newbie

ok, Grazie mille.
ora pero dovrei fare la stessa cosa per il file con gli errori?
sergio

alx_81 Profilo | Guru

>ok, Grazie mille.
>ora pero dovrei fare la stessa cosa per il file con gli errori?
non ti so dire.. non so cosa devi fare. Questa cosa che hai appena fatto si fa se vuoi configurare in maniera ciclica un connection manager..


--

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

sergino Profilo | Newbie

ciao Alex,
ti volevo ringraziare per la pazienza e la precisione con cui mi hai aiutato.

ciao ciao
sergio

alx_81 Profilo | Guru

>ciao Alex,
>ti volevo ringraziare per la pazienza e la precisione con cui
>mi hai aiutato.
ma figurati, un piacere!
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
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5