2012-11-16 13 views
5

Sto utilizzando le tabelle di staging per eseguire la convalida e inserire in live.SQL Server - copia dati dalla tabella di staging

Supponiamo Ho una tabella PERSONE

TABLE Persons 
(
Id int NOT NULL, 
LastName varchar(255) NOT NULL, 
FirstName varchar(255), 
HouseNumber int, 
) 

e un tavolo STAGING come segue

TABLE Persons_Staging 
(
Id int NOT NULL, 
LastName varchar(255) NOT NULL, 
FirstName varchar(255), 
HouseNumber varchar(255), 
) 

devo scrivere un procedimento per trasferire dati dalla tabella staging a la tabella live assicurandosi che non siano stati inseriti duplicati. Come posso ottenerlo?

Grazie in anticipo

+1

non ho fatto qualcosa di simile manualmente per anni, e hanno venire a vedere questo tipo di compito come interamente non produttivo. Questo potrebbe non essere un'opzione per ora, ma a lungo termine, prendere in considerazione l'idea di ottenere uno strumento per il confronto dei database. Questi sono progettati per fare tutto il lavoro pesante, lasciandoti libero di concentrarti sul lavoro di sviluppo. Uso gli strumenti di Redgate. Hanno una prova gratuita. http://www.red-gate.com –

risposta

9

Utilizzare il comando MERGE.

Qualcosa di simile a questo:

MERGE 
    INTO Persons AS TARGET 
    USING Persons_Staging AS SOURCE 
    ON TARGET.ID = SOURCE.ID 
    --WHEN MATCHED 
    -- THEN UPDATE??? 
    WHEN NOT MATCHED BY TARGET 
     THEN INSERT (Id , LastName , FirstName, HouseNumber) 
    VALUES (SOURCE.Id , SOURCE.LastName , SOURCE.FirstName, SOURCE.HouseNumber) 
    -- WHEN NOT MATCHED BY SOURCE 
    -- THEN DELETE??? 
; 

Se si desidera aggiornare i record esistenti si rimuovere il commento dalla parte UPDATE e aggiungere una clausola di aggiornamento adeguato. Lo stesso con la parte di cancellazione.

+1

+1 caso d'uso perfetto per il comando 'MERGE'! –

+0

Grazie, sono riuscito a farlo funzionare con il comando MERGE! – dopplesoldner

0

si potrebbe usare questo con un join esterno sinistro su entrambe le tabelle per ottenere tutti i dati che non sono gli stessi. Tali dati si può quindi inserire nella colonna

INSERT INTO Tab1(front,end,number) 
SELECT first,last,nr from tab2 LEFT OUTER JOIN tab1 ON front = first AND last = end AND convert(int,number) = CONVERT(int,nr) 
WHERE tab1.ID is null 

questo potrebbe funzionare, d'altra parte ci sono strumenti realizzati per questo genere di cose

Problemi correlati