2009-05-18 8 views
6

Sto tentando di aggiornare un campo in una tabella con i dati di un'altra tabella, in base a una chiave comune. Se fosse in SQL dritto, sarebbe qualcosa di simile:Aggiornamento tabella utilizzando SSIS

Update EHSIT 
set e.IDMSObjID = s.IDMSObjID 
from EHSIT e, EHSIDMS s 
where e.SITENUM = s.SITE_CODE 

Tuttavia, le due tabelle non sono nello stesso database, quindi sto cercando di utilizzare SSIS per fare l'aggiornamento. Oh, e il sitenum/site_code sono varchar in uno e nvarchar nell'altro, quindi dovrò fare una conversione dei dati in modo che corrispondano.

Come faccio?
Ho un oggetto flusso di dati, con la sorgente come EHSIDMS e la destinazione come EHSIT. Ho una conversione dei dati per convertire l'unicode in non-unicode. Ma come posso aggiornare in base alla partita? Ho provato con la destinazione, utilizzando un comando SQL come modalità di accesso ai dati, ma non sembra avere la tabella di origine. Se mappo semplicemente il campo da aggiornare, come lo limita in base ai campi corrispondenti?

Sto per esportare la mia tabella di origine in Excel o qualcosa del genere, quindi provo a immettere da lì, anche se sembra che tutto ciò che mi porterebbe sarebbe rimuovere il passaggio di conversione dei dati.

Non dovrebbe esserci un'attività di aggiornamento dati o qualcosa del genere? E 'una di quelle attività di trasformazione del Flusso di dati, e non sto capendo quale sia?

risposta

8

È possibile utilizzare SQLCommand (con parametri) ma si scrive effettivamente uno UPDATE per ogni riga. Ho trovato preferibile scrivere una tabella di staging sul lato di destinazione (tutti i dati dal lato remoto oi dati determinati da SSIS da modificare) e utilizzare un singolo SQL UPDATE per eseguire l'aggiornamento.

+1

Ok, funziona. Ho creato una tabella temporanea nel mio db di destinazione, ho copiato i dati in essa e poi ho usato l'istruzione di aggiornamento per ottenere il mio campo compilato. Elimina la tabella temporanea e ho finito. Grazie. – thursdaysgeek

+1

Cerca sempre di usare una tabella di staging, prova a pensare in blocchi di dati. Se hai 1 milione di record che necessitano di essere aggiornati, è molto lento aggiornare ogni record con una dichiarazione di aggiornamento. Quindi dovresti usare 1 singola tabella e una dichiarazione per fare gli aggiornamenti. – JSC

2

È sempre possibile utilizzare il nome completo del database.

UPDATE server1.databasename.EHSIT 
SET E.IDMSOBJID = S.IDMSOBJID 
FROM server1.databasename.EHSIT E, server2.databasename.EHSIDMS S 
WHERE E.SITENUM = S.SITE_CODE 



[serverpath].[database].[databaseobject] 
0

Ho trovato che l'uso di una dimensione lentamente cambiando, con la chiave business come il valore che si sta corrispondente su e gli altri attributi desiderati aggiornato come la modifica dei valori sembra funzionare.

Devtron, ho provato questo e ottenere errori sul percorso del server, ci sono un sacco di/s in esso. Mi è stato anche detto che questo è altamente sottovalutato, soprattutto se si tratta di un'operazione che si verifica molto.

+2

Le dimensioni di Modifica lente faranno il lavoro, ma sono MOLTO lente su grandi quantità di dati (dovuto al fatto che esegue azioni riga per riga - vedere il commento di JSC sopra) –

+0

Guardato dall'alto in basso? Penso di no. Usando il mio esempio UPDATE, non hai nemmeno bisogno di SSIS per eseguire la transazione. Dipende anche dalla configurazione della rete e dalle configurazioni del database collegato. – D3vtr0n