2009-11-25 9 views
6

Sto copiando alcuni dati utente da un SqlServer a un altro. Chiamali Alpha e Beta. Il pacchetto SSIS viene eseguito su Beta e riceve le righe su Alpha che soddisfano una determinata condizione. Il pacchetto aggiunge quindi le righe alla tabella di Beta. Abbastanza semplice e funziona benissimo.Come si ottiene un pacchetto SSIS per inserire solo nuovi record durante la copia di dati tra server

Il problema è che voglio solo aggiungere nuove righe in Beta. Normalmente vorrei solo fare qualcosa di semplice come ....

INSERT INTO BetaPeople 
SELECT * From AlphaPeople 
where ID NOT IN (SELECT ID FROM BetaPeople) 

Ma questo non funziona in un pacchetto SSIS. Almeno non so come e questo è il punto di questa domanda. Come si fa a fare questo attraverso i server?

+0

quale versione/edizione? –

risposta

4

Il tuo esempio sembra semplice, sembra che tu stia aggiungendo solo nuove persone, non cercando i dati modificati nei record esistenti. In questo caso, memorizzare l'ultimo ID nel DB.

CREATE TABLE dbo.LAST (RW int, LastID Int) 
go 
INSERT INTO dbo.LAST (RW, LastID) VALUES (1,0) 

Ora è possibile utilizzarlo per inserire l'ultimo ID della riga trasferita.

UPDATE dbo.LAST SET LastID = @myLastID WHERE RW = 1 

Quando si seleziona fonte OLE DB, impostare modalità di accesso ai dati al SQL Comando e utilizzare

DECLARE @Last int 
SET @Last = (SELECT LastID FROM dbo.LAST WHERE RW = 1) 
SELECT * FROM AlphaPeople WHERE ID > @Last; 

nota, io presumo che si sta utilizzando per il vostro ID int IDENTITY PK.

Se avete per monitorare le modifiche dei dati di record esistenti, quindi la colonna "ultima cambiato" in ogni tabella, e il tempo vendite di dell'ultimo trasferimento.

A una tecnica diversa implica l'installazione di un server collegato su Beta ad Alpha e l'esecuzione dell'esempio senza utilizzare SSIS. Mi aspetto che questo sia molto più lento e più dispendioso in termini di risorse rispetto alla soluzione SSIS.

INSERT INTO dbo.BetaPeople 
SELECT * FROM [Alpha].[myDB].[dbo].[AlphaPeople] 
WHERE ID NOT IN (SELECT ID FROM dbo.BetaPeople) 
2

Questo è il classico problema di rilevamento Delta. La soluzione migliore è utilizzare Change Data Capture con/senza SSIS. Se quello che stai cercando è un'attività di una volta in vita, non c'è bisogno di andare per SSIS. Utilizzare altri mezzi come server collegato e confrontare con i record esistenti.

+2

Ciao Faiz - la tua risposta sarebbe più utile se hai spiegato cos'è Change Data Capture. – Mike

3

metodo più semplice che ho usato è il seguente:

  • query Alpha in un'attività Origine in un flusso di dati e portare in record al flusso di dati.
  • Eseguire tutte le trasformazioni necessarie.
  • Prima di scrivere alla destinazione (Beta) eseguire una ricerca corrispondente colonna ID da Alpha a quelli Beta. Nella prima pagina dell'editor trasformazione Ricerca, assicuratevi di selezionare "Redirect righe da nessuna uscita match" dal menu a tendina "Specifica come gestire le righe con la società corrispondenza di errore"
  • link il compito di ricerca per la destinazione. Questo ti darà un prompt dove puoi specificare che sono le righe non abbinate che vuoi inserire.
+1

Grazie per la modifica @Mike Per chiarire la risposta è stata scritta una versione precedente di SSIS e l'avete aggiornata al comportamento delle versioni più recenti. –

0

Il seguente dovrebbe risolvere l'edizione dei record carico cambiata e nuovi usando SSIS:

  1. estrarre i dati da un flusso di dati USINT origine.
  2. Estrarre i dati dalla destinazione.
  3. Corrispondenza sulla chiave primaria Aggiungere record non corrispondenti e dividere i record corrispondenti e non corrispondenti da record di origine e corrispondenti da Destinazione chiamarli Matched_Source, Unmatch_Source e Matched_Target.
  4. Confronta Matched_Source e Matched_Target e Spalato Matched_Source a cambiato e Invariato.
  5. Tabella TempChanged con carico nullo.
  6. Aggiungi record modificati a TempChanged.
  7. eseguire lo script SQL/stored procedure per eliminare i record da Target per la chiave primaria in TempChanged e aggiungere record in TempChanged a Target.
  8. Aggiungi Unmatched_Source a Target.
1

enter image description here

  1. Aggiungi una ricerca tra la sorgente e la destinazione
  2. Fare clic destro la casella di ricerca per aprire trasformazione Ricerca Editor.
  3. Scegliere [redirect righe da nessuna uscita partita.
  4. enter image description here
  5. colonne aperte, mappa le colonne chiave,
  6. Aggiungere una voce con la chiave tabella nella colonna di ricerca, operazione di ricerca come enter image description here
  7. Collegare box di ricerca per destinazione, selezionare [Occhiata alcuna corrispondenza in uscita]
Problemi correlati