2010-06-10 13 views
8

Mam table a i table b. (SQL Server 2008)T-SQL - Czy istnieje (bezpłatny) sposób porównywania danych w dwóch tabelach?

Obie tabele mają dokładnie taki sam schemat.

Dla potrzeb tego pytania, rozważ table a = mój lokalny stół dla deweloperów, table b = stół na żywo.

Potrzebuję utworzyć skrypt SQL (zawierający instrukcje UPDATE/DELETE/INSERT), który zaktualizuje tabelę b tak, jak w tabeli a. Skrypt ten zostanie następnie wdrożony w żywej bazie danych.

Jakieś bezpłatne narzędzia, które mogą to zrobić, czy lepiej, ale sposób, w jaki mogę to zrobić sam?

Wydaje mi się, że prawdopodobnie potrzebuję jakiegoś typu sprzężenia we wszystkich polach w tabelach, a następnie wygeneruję na tej podstawie dynamiczny SQL.

Ktoś ma jakieś pomysły?

EDIT

Dobra, pomyślałem, że wyjaśnienie to pytanie niewiele.

Tabela, którą należy zsynchronizować, to prosta tabela przeglądowa. Dane są bardzo proste i proste.

Oto pomysł co TABLE A może wyglądać następująco:

IdFoo   Activity  IsFoo 
1    Foo   1 
2    Bar   0 

Oto pomysł co TABLE B może wyglądać następująco:

IdFoo   Activity  IsFoo 
1    Foo   1 
2    Bar   1 

Zasadniczo, wszystko co chcę zrobić, to zmiana, która BIT kolumna (IsFoo) w TABLE B, aby dopasować odpowiednią wartość w TABLE A dla tego samego identyfikatora.

Pamiętaj:

  • TABLE A jest na moim komputerze lokalnym
  • TABLE B znajduje się na serwerze żywo

Oczywiście mam (wiarygodne) zapasową TABLE B na moim komputerze lokalnym, które muszę napisać skrypt, a następnie uruchomić skrypt na serwerze na żywo.

Tabela ma także integralność referencyjną (inne kolumny nie zostały pokazane). Co oznacza, że ​​nie mogę po prostu usunąć wszystkiego w TABLE B i zrobić wstawkę od TABLE A.

Ten skrypt będzie jednorazowy. Więc nie ma potrzeby robienia rzeczy takich jak serwer połączony, replikacja, itp. Doceń odpowiedzi chociaż chłopaki. =)

EDIT:

Ok - więc Poszedłem z odpowiedzią Olega (VS2010 Danych porównania). Szybko, łatwo i działa uroczo.

Nie można powiedzieć, że inne odpowiedzi są nieprawidłowe. Doceniam wszystkie odpowiedzi!

+0

Każda odpowiedź będzie bardzo zależała od tego, czy masz pole, które można wiarygodnie wykorzystać do dopasowania dwóch rzędów. –

+0

Odpowiedź zależy również od tego, jak często trzeba to robić i jak duże są dane? Jeśli jest to jednorazowa rzecz, możesz po prostu użyć Kreatora importu/eksportu do przeniesienia 'table b' do' table a'. Jeśli chcesz, aby zmiany zostały natychmiastowo odzwierciedlone, możesz wdrożyć replikację. – codingbadger

Odpowiedz

5

W bardzo prostych przypadkach będzie można zdefiniować na lokalnym serwerze SQL nowy połączony serwer (zobacz w Microsoft SQL Server Management Studio w sekcji "Obiekty serwera"/"Serwer połączony") i użyj INNER JOIN i OUTER JOIN, aby dowiedzieć się różnice między tabelami A i B.

W rzeczywistej i bardziej złożonej sytuacji należy wziąć pod uwagę obszary Integralności Referencyjnej, różne Klucze Zagraniczne i Tożsamość (automatycznie przyrostowe) w docelowej bazie danych, aby skrypt aktualizacji był bardziej złożony. Dlatego zalecam, aby nie tracić czasu na tworzenie synchronizacji bazy danych dla programistów i produkcji i zamiast tego używaj standardowego narzędzia. Używam na przykład funkcji Visual Studio Team Edition 2008 (lub wydanie bazy danych) lub Visual Studio 2010 Ultimate Edition do porównywania danych w dwóch bazach danych. Pracuje bardzo dobrze.

+0

Ive dostałem VS2010 - jak porównać dane w dwóch bazach danych z tym? Czy masz referencję/link? – RPM1984

+1

Po prostu wejdź w menu "Dane" wybierz "Porównanie danych" i "Nowe porównanie danych". Następnie wybierz źródłowe i docelowe bazy danych oraz "Opcje porównywania danych". Następnie postępuj zgodnie z instrukcjami kreatora. Na końcu możesz sprawdzić porównywanie wyników, "destelect" niektóre różnice i albo zapisać zmiany bezpośrednio w docelowej bazie danych lub wygenerować skrypt SQL. W menu "Narzędzia" "Opcje" możesz wybrać opcje generowania kodu. Możesz nie tylko porównywać dane, ale także w razie potrzeby porównywać schematy baz danych. – Oleg

+0

Fajnie - ok dajcie, że pójdziecie jutro (kiedy wracam do pracy) i pozwolę wam wiedzieć, jak idę - okrzyki na napiwki! – RPM1984

4

Istnieje SQL Data Compare z RedGate (ale nie za darmo) i istnieje również funkcja SMO i built in.

Wreszcie Wikipedia ma dość obszerną listę oprogramowania.

+1

Narzędzie porównywania danych SQL RedGate nie jest bezpłatne. SMO jest dobrym pomysłem, a link do Wikipedii jest świetnym źródłem. –

+1

Przepraszam Bernard, błędnie przeczytałem część pytania i jakoś zinterpretowałem to tak, jakby wolna była preferowana, choć opcjonalna, zredagowałem odpowiedź, aby to odzwierciedlić. Potrzebuję więcej kawy, jak sądzę. – Don

+0

Link wikipedia teraz, denerwująco. po prostu przekierowuje na główną stronę SQL Server. – Fishcake

5

Jeśli chcesz tylko zsynchronizować tabele i nie chcesz już wcześniej sprawdzać zmian, może to zrobić komenda MERGE.

MSDN - MERGE (Transact-SQL)

The (bezpłatny) Microsoft SSDT ma również porównać dane i synchronizacja wbudowany choć jest bardziej ograniczona niż płatnych narzędzi, takich jak dane RedGate porównania.

0

Możesz również spróbować użyć import and export data dostarczonego przez SQL Server 2008. Jest to dość prosty sposób na kopiowanie wszystkich danych z dowolnego miejsca. Robię to samo i działa idealnie.

3

Ponieważ jest jednorazowa, można użyć tej kwerendy, aby znaleźć wiersze, które są różne w tych dwóch tabelach:

(SELECT * FROM TABLE_A 
MINUS 
SELECT * FROM TABLE_B) 

UNION ALL 

(SELECT * FROM TABLE_B 
MINUS 
SELECT * FROM TABLE_A) 

MINUS porówna rekordy pole po polu, a następnie będzie wyrzucić rekordy z pierwszej tabeli dla który jest identyczny w drugiej tabeli. Działa to tak:

  • Pierwszy MINUS pobiera wszystkie rekordy z TABLE_A, że nie są w TABLE_B
  • II MINUS pobiera wszystkie rekordy z TABLE_B, że nie są w TABLE_A
  • Unii pobiera wszystkie rekordy z obu tabel, dla których nie ma pasującego rekordu w innej tabeli.

Teraz można wstawić te rekordy do tabeli tymczasowej, a następnie wstawiać/aktualizować.

W zależności od potrzeb można ograniczyć listę pól do porównania.

Pamiętaj, że aby to zadziałało, potrzebujesz klucza podstawowego.

Edytuj:
Oops. Serwer SQL nie obsługuje operatora MINUS. Pracuję z ORACLE w zeszłym roku i pół, więc to było automatyczne.

Zamiast tego można użyć operatora EXCEPT. Zobacz ten artykuł: EXCEPT and INTERSECT (Transact-SQL)

Edycja 2:

Re scherand's komentarz:
Jeśli on naprawdę nie może się połączyć z komputera lokalnego do serwera żyć, niż może on po prostu zrzucić TABLE_A i załadować go na serwerze. Tak czy inaczej, celem jest zmiana danych tabeli na serwerze na żywo.

+0

Interesujące ... nigdy nie słyszałem słowa kluczowego MINUS. Dam to również (i tak - pierwsza kolumna to PK - tożsamość). – RPM1984

+0

To nie działa, chyba że OP może zdefiniować swoją stację roboczą/serwer na żywo jako serwer połączony (jak zauważył @Oleg) ... Cytuj: "Pamiętaj: TABELA A jest na moim lokalnym komputerze. TABELA B jest włączona serwer na żywo " – scherand

3

wpadłem na ten sam problem jak ty - szukał darmowe narzędzie, które porównuje dane z dwóch tabel MS SQL - i nic nie znalazłem. Następnie utworzyłem proste darmowe narzędzie wiersza poleceń. Porównuje dane z dwóch tabel i tworzy INSERT/DELETE/UPDATE statemenets, aby dane tabeli docelowej były takie same jak źródło. Teraz używam go do porównywania danych, a jak to jest całkowicie za darmo, można polecić to sprawdzić pod adresem: Sourceforge.net - UltraDBC

0

co się dzieje, jeśli:

  1. kopia devTableA na prod,
  2. zawiesić zależnościami na prodTableB
  3. przemianować prodTable B do prodTableB1,
  4. zmiany nazwy devTableA do prodTableB
  5. reimplement zależności w nowym prodTableB
  6. Przetestuj nowy prodTableB, a następnie usuń stare stare prodTableB

?

lub jeśli trzeba być więcej szacunku istniejącego prodTableB i swoich wartości kolumny tożsamości zarówno dev i prod meczu (nawet jeśli wartości nie są ciągłe) ...

declare @iLast int, @x int, @y int 
select @iLast = (select MAX(id) from prodTableB) 
set @x = 1 
while @x <= @iLast 
begin 
    select @y = (select COUNT(*) from prodTableB where id = @x) 
    if @y = 1 
    begin 
     update prodTableB set isFoo = (select isFoo from devTableA where [email protected] 
    end 
    @[email protected]+1 
end 
6

Późne odpowiedź, ale może być użytecznym dla odwiedzających wątek

Oprócz innych wspomnianych rozwiązań, mogę zasugerować wypróbowanie ApexSQL Data Diff. Może porównywać i synchronizować dane bazy danych SQL Server (w żywych bazach danych, jak również kopie zapasowe) oraz automatyzować i planować migracje danych. Działa również z ogromnymi bazami danych i jest w stanie dokonywać porównań bezpośrednio z SSMS.

Możesz pobrać to narzędzie za darmo i grać z nim. Posiada w pełni funkcjonalną bezpłatną wersję próbną i oferuje wydanie społecznościowe (po zakończeniu okresu próbnego), które działa na SQL Express i Azure SQL Database.

Aby dowiedzieć się więcej o narzędziu, może odwiedzić http://www.apexsql.com/sql_tools_datadiff.aspx

0

Można też rzucić okiem na xSQL Data Compare. Wersja SQL Express jest darmowa i istnieje również wersja Lite, która zrobi lewę dla małych baz danych.

Dobre darmowe narzędzie to także porównanie danych z SSDT.

Nota prawna: Jestem powiązany z xSQL.

Powiązane problemy