Oprócz tablediff i powerhell wspomnianych w poprzednich odpowiedziach, możesz także użyć SQL z instrukcją UNION ALL, aby znaleźć rekordy, które nie pasują do 2 identycznych tabel:
SELECT MIN(TableName) AS TableName
,ID
,NAME
,lastname
,Address
,City
FROM (
SELECT 'Table A' AS TableName
,Customers.id
,Customers.NAME
,Customers.lastname
,Customers.Address
,Customers.City
FROM Customers
UNION ALL
SELECT 'Table B' AS TableName
,CustomersOld.id
,CustomersOld.NAME
,CustomersOld.lastname
,CustomersOld.Address
,CustomersOld.City
FROM CustomersOld
) tmp
GROUP BY ID
,NAME
,lastname
,Address
,City
HAVING COUNT(*) = 1
ORDER BY id;
Inną opcją, którą możesz wypróbować, jest porównywanie danych w samym Visual Studio. Porównuje dane w źródłowej i docelowej bazie danych i tworzy skrypt synchronizacji dla tabel wybranych do synchronizacji.
Na koniec możesz użyć narzędzia porównywania danych SQL - ApexSQL Data Diff , aby ustawić wszystkie opcje synchronizacji, mapować tabele i kolumny pod różnymi nazwami, stworzyć własne klucze do porównania w GUI. Możesz zaplanować, aby działał bez nadzoru, a wszystko, co musisz zrobić, to sprawdzić historię zadań programu SQL Server rano. Jeśli potrzebujesz więcej informacji na temat tych opcji, polecam przeczytanie tego artykułu: http://solutioncenter.apexsql.com/automatically-compare-and-synchronize-sql-server-data/
Korzystanie z rodzimych narzędzi:
tablediff : narzędzie tablediff porównuje dane w tabeli źródłowej z tabelą w tabeli docelowej.
powershell: porównaj-obiekt pozwala to osiągnąć. tutaj jest dobry przykład
strona trzecia:
schemat redgate i porównanie danych. Możesz nawet użyć programu PowerShell i porównania schematów / danych do automatyzacji.
źródło
Ostatnio użyłem tego do podobnego celu:
Polega on na spójności klucza podstawowego. Ale w końcu musisz mieć coś spójnego. Meta skrypt do generowania kodu jak wyżej jest stosunkowo łatwy do napisania i sprawia, że tabele wielokolumnowe są łatwe do porównania.
Co do synchronizacji trzeba będzie
source left join target
itarget left join source
, a następnie zdecydować, co chcesz zrobić z wynikiem każda.źródło
To powinno dać ci różnice między dwiema tabelami, możesz następnie zawinąć to w zapytanie wstawiania, aby wstawić różnice z A do B lub odwrotnie.
źródło
Jedno z naszych bezpłatnych narzędzi ma pełny interfejs dla TableDiff:
http://nobhillsoft.com/Diana.aspx
Sprawdź także nasze narzędzie do porównywania DB. Jest to jedyny taki, który porównuje nieograniczoną ilość danych (żaden inny nie może robić milionów i milionów rekordów)… tak długo, jak porównasz dwa połączone serwery
http://nobhillsoft.com/NHDBCompare.aspx
(w tym wątku widzieliśmy inne linki do produktów innych firm, więc uważamy, że warto wspomnieć o naszym ... prosimy o informację, jeśli tak nie jest)
źródło
Jeśli obie tabele mają podobne klucze podstawowe, możesz użyć poniższej strategii, aby porównać tabele źródłowe i docelowe: (Kolumny kluczy kompozytowych oznaczyłem gwiazdką)
Działa to, ponieważ związek domyślnie zwraca odrębne rekordy. Tak więc dla każdego wiersza (identyfikowanego przez jakiś klucz) w źródle, które ma być dokładnie dopasowane do celu, można oczekiwać, że połączenie src i celu zwróci 1 wiersz dla dowolnego danego klucza. Tak więc możesz użyć powyższej strategii, aby dowiedzieć się, które klucze zwracają wynik unii posiadającej wiele wierszy, a następnie ponownie przeszukuj cel unii src, (tym razem wybierając tylko rekordy różniące się łącząc się z tabelą różnic) wybierając wszystkie kolumny, które chcesz porównaj, uporządkuj według kolumn tworzących klucz, a zobaczysz dokładnie, które kolumny są niezgodne. Zwróć uwagę, że nazwy kolumn w źródle i celu nie muszą być takie same, ponieważ można je aliasować za pomocą instrukcji „as”.
źródło
Aby znaleźć różnice między dwiema identycznymi tabelami
WYBIERZ *
Z SOURCE01.dbo. Klienci
UNION
WYBIERZ *
Z TARGET01.dbo. Klienci
Z WYJĄTKIEM
WYBIERZ *
Z SOURCE01.dbo. Klienci
INTERSECT
WYBIERZ *
Z TARGET01.dbo. Klienci
Kolejność operacji powoduje, że INTERSECT jest wykonywany jako pierwszy, co daje zestaw danych zawierający tylko wiersze istniejące w obu tabelach. Po drugie, wykonywany jest UNION, który daje wszystkie wiersze z obu tabel bez duplikatów. Na koniec wykonywany jest WYJĄTEK, który usuwa z UNII (wszystkie wiersze obu tabel) zestaw danych INTERSECT, który jest wierszami w obu tabelach. To pozostawia zestaw danych zawierający tylko wiersze, które istnieją w jednej tabeli, ale nie w drugiej. Jeśli zestaw danych wróci pusty, wszystkie wiersze są takie same między tabelami.
https://docs.microsoft.com/en-us/sql/t-sql/language-elements/set-operators-except-and-intersect-transact-sql
źródło
Miałem podobny problem i użyłem polecenia SQL „EXCEPT”, aby rozwiązać problem. Polecenie EXCEPT przyjmuje dwie instrukcje SELECT i zwraca wiersze zwracane przez pierwszą instrukcję SELECT (po lewej), a nie przez drugą (po prawej) instrukcję SELECT.
PS: Schemat dla obu tabel zwróconych przez instrukcję SELECT musi być zgodny.
Dla większej przejrzystości odwiedź: Tutorials Point Page tutaj
źródło
Skrypt (podany wraz z odpowiednimi szczegółami) porównuje 2 tabele (powiedzmy Klienci na serwerze 1 do Klienci na serwerze 2).
Ten skrypt będzie przydatny, jeśli porównujesz tabelę z wieloma kolumnami, ale nie możesz znaleźć dokładnej kolumny niezgodnej.
Mam tabelę z 353 kolumnami i musiałem porównać ją z inną tabelą i znaleźć z wartościami nie pasującymi, a ten skrypt pomoże ci znaleźć dokładną krotkę.
źródło
Myślę, że powinieneś spróbować xSQL Data Compare , który załatwi sprawę w twoim przypadku. Powiedzmy na przykład, że określasz
Po porównaniu tabel w wyniku porównania możesz określić, że chcesz zsynchronizować tylko różnice w lewej tabeli, które utworzyłyby skrypt SQL do wstawienia do TARGET01.dbo. Klienci wszystkich wierszy, których nie ma w tej tabeli, ale istnieją w SOURCE01.dbo.Customers (Osiągnięcie wyniku UNION bez duplikatów). Mam nadzieję że to pomoże!
Ujawnienie: Jestem związany z xSQL.
źródło