2012-11-16 14 views
5

Używam tabel pomostowych do przeprowadzania sprawdzania poprawności i wstawiania do trybu bieżącego.Serwer SQL - kopiowanie danych z tabeli pomostowej

Załóżmy Mam tabeli OSÓB

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

i stół inscenizacja następująco

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

muszę napisać procedurę, aby przesyłać dane z tabeli pomostowym do bieżący stół przy jednoczesnym zapewnieniu braku duplikatów. Jak mogę to osiągnąć?

góry dzięki

+1

nie robiłem czegoś takiego ręcznie przez wiele lat i mają postrzegają to zadanie jako całkowicie nieproduktywne. To może nie być opcja na teraz, ale długoterminowe, należy rozważyć uzyskanie narzędzia porównywania baz danych. Są one zaprojektowane tak, aby wykonywać wszystkie ciężkie operacje podnoszenia, dzięki czemu możesz skupić się na pracach rozwojowych. Używam narzędzi Redgate. Mają bezpłatny okres próbny. http://www.red-gate.com –

Odpowiedz

9

użyć polecenia MERGE.

coś takiego:

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??? 
; 

Jeśli chcesz zaktualizować istniejące rekordy odkomentuj UPDATE części i dodać odpowiednią klauzulę aktualizacji. To samo z częścią usuwania.

+1

+1 idealny przypadek użycia dla polecenia "MERGE"! –

+0

Dzięki, udało mi się uruchomić to za pomocą polecenia MERGE! – dopplesoldner

0

można użyć tego z lewym sprzężeniem zewnętrznym w obu tabelach, aby uzyskać wszystkie dane, które nie są takie same. Że dane, które następnie można wstawić do kolumny

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 

ten mógł pracować, z drugiej strony istnieją narzędzia wykonane z tego rodzaju rzeczy na

Powiązane problemy