Come si ottiene un pacchetto SSIS per inserire nuovi record solo quando si copiano dati tra server?

StackOverflow https://stackoverflow.com/questions/1800119

  •  05-07-2019
  •  | 
  •  

Domanda

Sto copiando alcuni dati utente da un server SQL a un altro. Chiamali Alpha e Beta. Il pacchetto SSIS viene eseguito su Beta e ottiene le righe su Alpha che soddisfano una determinata condizione. Il pacchetto aggiunge quindi le righe alla tabella di Beta. Abbastanza semplice e funziona alla grande.

Il problema è che voglio solo aggiungere nuove righe in Beta. Normalmente farei 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 sia il punto di questa domanda. Come si potrebbe fare per fare questo attraverso i server?

È stato utile?

Soluzione

Il tuo esempio sembra semplice, sembra che tu stia aggiungendo solo nuove persone, non cercando 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 puoi usarlo per inserire l'ultimo ID della riga trasferita.

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

Quando si seleziona Sorgente OLEDB , impostare modalità di accesso ai dati su Comando SQL e utilizzare

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

Nota, presumo che tu stia usando ID int IDENTITY per il tuo PK.

Se devi monitorare le modifiche ai dati dei record esistenti, allora hai l'ultima quotazione " colonna in ogni tabella e tempo di memorizzazione dell'ultimo trasferimento.

Una tecnica diversa implicherebbe la configurazione di un server collegato da Beta ad Alpha e l'esecuzione del tuo esempio senza utilizzare SSIS. Mi aspetto che questo sia molto più lento e 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)

Altri suggerimenti

Il metodo più semplice che ho usato è il seguente:

  • Interroga Alpha in un'attività Origine in un flusso di dati e porta i record nel flusso di dati.
  • Esegui qualsiasi trasformazione necessaria.
  • Prima di scrivere sulla destinazione (Beta), esegui una ricerca corrispondente alla colonna ID da Alpha a quelli in Beta. Nella prima pagina dell'editor di trasformazione della ricerca, assicurati di selezionare " Reindirizza le righe in modo che non corrispondano all'output " dall'elenco a discesa " Specifica come gestire le righe con errore ora corrispondente "
  • Collegare l'attività di ricerca alla destinazione. Questo ti darà un prompt dove puoi specificare che sono le righe senza eguali che vuoi inserire.

Questo è il classico problema di rilevamento delta. La soluzione migliore è utilizzare Change Data Capture con / senza SSIS. Se quello che stai cercando è un'attività da fare almeno una volta nella vita, non è necessario utilizzare SSIS. Utilizza altri mezzi come server collegato e confronta con i record esistenti.

 inserisci qui la descrizione dell'immagine

  1. Aggiungi una ricerca tra l'origine e la destinazione
  2. Fai clic con il pulsante destro del mouse sulla casella di ricerca per aprire l'Editor trasformazione trasformazione.
  3. Scegli [Reindirizza le righe in modo che non corrispondano all'output.
  4.  inserisci qui la descrizione dell'immagine
  5. Apri colonne, mappa le colonne chiave
  6. Aggiungi una voce con la chiave della tabella nella colonna di ricerca, operazione di ricerca come inserisci qui la descrizione dell'immagine
  7. Collega la casella di ricerca alla destinazione, scegli [Cerca nessun risultato di corrispondenza]

Quanto segue dovrebbe risolvere il problema del caricamento di record modificati e nuovi mediante SSIS:

  1. Estrai dati dal flusso dati usint di origine.
  2. Estrai dati dalla destinazione.
  3. Corrispondenza su chiave primaria Aggiungi record Unmatch e dividi record corrispondenti e non corrispondenti dalla sorgente e record corrispondenti dalla destinazione chiamali Matched_Source, Unmatch_Source e Matched_Target.
  4. Confronta Matched_Source e Matched_Target e dividi Matched_Source con Modificato e Invariato.
  5. Tabella TempChanged a carico nullo.
  6. Aggiungi record modificati a TempChanged.
  7. Esegui script SQL / proc memorizzato per eliminare i record dalla destinazione per la chiave primaria in TempChanged e aggiungere i record in TempChanged alla destinazione.
  8. Aggiungi unmatched_Source alla destinazione.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top