SQL Server zapewnia nam różne rozwiązania do replikacji lub archiwizacji tabeli lub tabel bazy danych do innej bazy danych lub tej samej bazy danych o różnych nazwach. Jako programista SQL Server lub administrator bazy danych możesz napotkać sytuacje, w których musisz sprawdzić, czy dane w tych dwóch tabelach są identyczne, a jeśli przez pomyłkę dane nie są replikowane między tymi dwiema tabelami, musisz zsynchronizować dane między stołami. Dodatkowo, jeśli otrzymasz komunikat o błędzie, który przerywa proces synchronizacji lub replikacji danych, ze względu na różnice w schemacie między tabelami źródłowymi i docelowymi, musisz znaleźć łatwy i szybki sposób na zidentyfikowanie różnic w schemacie, ZMIEŃ tabele, aby schemat identyczny po obu stronach i wznowić proces synchronizacji danych.
W innych sytuacjach potrzebujesz łatwego sposobu na uzyskanie odpowiedzi TAK lub NIE, jeśli dane i schemat dwóch tabel są identyczne, czy nie. W tym artykule omówimy różne sposoby porównywania danych i schematu między dwiema tabelami. Metody dostarczone w tym artykule będą porównywać tabele znajdujące się w różnych bazach danych, co jest bardziej skomplikowanym scenariuszem, i mogą być również łatwo użyte do porównania tabel znajdujących się w tej samej bazie danych o różnych nazwach.
Przed opisaniem różnych metod i narzędzi, które można wykorzystać do porównywania danych tabel i schematów, przygotujemy nasze środowisko demonstracyjne, tworząc dwie nowe bazy danych i utworzymy jedną tabelę w każdej bazie danych, z jedną niewielką różnicą typów danych między tymi dwiema tabelami, ponieważ pokazane w poniższych instrukcjach T-SQL CREATE DATABASE i CREATE TABLE:
CREATE DATABASE TESTDB CREATE DATABASE TESTDB2 CREATE TABLE TESTDB.dbo.FirstComTable ( ID INT IDENTITY (1,1) PRIMARY KEY, FirstName VARCHAR (50), LastName VARCHAR (50), Address VARCHAR (500) ) GO CREATE TABLE TESTDB2.dbo.FirstComTable ( ID INT IDENTITY (1,1) PRIMARY KEY, FirstName VARCHAR (50), LastName VARCHAR (50), Address NVARCHAR (400) ) GO
Po utworzeniu baz danych i tabel wypełnimy dwie tabele pięcioma identycznymi wierszami, a następnie wstawimy kolejny nowy rekord tylko do pierwszej tabeli, jak pokazano w poniższych instrukcjach INSERT INTO T-SQL:
INSERT INTO TESTDB.dbo.FirstComTable VALUES ('AAA','BBB','CCC') GO 5 INSERT INTO TESTDB2.dbo.FirstComTable VALUES ('AAA','BBB','CCC') GO 5 INSERT INTO TESTDB.dbo.FirstComTable VALUES ('DDD','EEE','FFF') GO
Teraz środowisko testowe jest gotowe do rozpoczęcia opisywania metod porównywania danych i schematów.
Porównaj dane tabel za pomocą LEWEJ ŁĄCZY
Słowo kluczowe LEFT JOIN T-SQL służy do pobierania danych z dwóch tabel poprzez zwrócenie wszystkich rekordów z lewej tabeli i tylko dopasowanych rekordów z prawej tabeli oraz wartości NULL z prawej tabeli, gdy nie ma zgodności między dwiema tabelami.
W celu porównania danych słowo kluczowe LEFT JOIN może być użyte do porównania dwóch tabel na podstawie wspólnej unikalnej kolumny, takiej jak kolumna ID w naszym przypadku, jak w poniższym wyrażeniu SELECT:
SELECT * FROM TESTDB.dbo.FirstComTable F LEFT JOIN TESTDB2.dbo.FirstComTable S ON F.ID =S.ID
Poprzednie zapytanie zwróci wspólne pięć wierszy istniejących w dwóch tabelach, oprócz wiersza istniejącego w pierwszej tabeli i brakującego w drugiej, pokazując wartości NULL po prawej stronie wyniku, jak pokazano poniżej:
Z poprzedniego wyniku można łatwo wywnioskować, że szósta kolumna, która istnieje w pierwszej tabeli, została pominięta w drugiej tabeli. Aby zsynchronizować wiersze między tabelami, musisz ręcznie wstawić nowy rekord do drugiej tabeli. Metoda LEFT JOIN jest pomocna w weryfikacji nowych wierszy, ale nie pomoże w przypadku aktualizacji wartości kolumn. Jeśli zmienisz wartość kolumny Adres w piątym wierszu, metoda LEFT JOIN nie wykryje tej zmiany, jak pokazano poniżej:
Porównaj dane tabel przy użyciu klauzuli OPRÓCZ
Instrukcja EXCEPT zwraca wiersze z pierwszego zapytania (zapytanie po lewej), które nie są zwracane z zapytania drugiego (zapytanie po prawej). Innymi słowy, instrukcja EXCEPT zwróci różnicę między dwoma instrukcjami lub tabelami SELECT, co ułatwia nam porównanie danych w tych tabelach.
Wyrażenie EXCEPT może być użyte do porównania danych we wcześniej utworzonych tabelach, biorąc różnicę między zapytaniem SELECT * z pierwszej tabeli a zapytaniem SELECT * z drugiej tabeli, używając poniższych instrukcji T-SQL:
SELECT * FROM TESTDB.dbo.FirstComTable F EXCEPT SELECT * FROM TESTDB2.dbo. FirstComTable S
Wynikiem poprzedniego zapytania będzie wiersz dostępny w pierwszej tabeli i niedostępny w drugiej, jak pokazano poniżej:
Użycie instrukcji EXCEPT do porównania dwóch tabel jest lepsze niż instrukcja LEFT JOIN, ponieważ zaktualizowane rekordy zostaną przechwycone w wyniku różnic danych. Załóżmy, że zaktualizowaliśmy adres wiersza numer 5 w drugiej tabeli i ponownie sprawdziliśmy różnicę za pomocą instrukcji EXCEPT, zobaczysz, że wiersz numer 5 zostanie zwrócony z wynikami różnic, jak pokazano poniżej:
Jedyną wadą używania instrukcji EXCEPT do porównywania danych w dwóch tabelach jest konieczność ręcznej synchronizacji danych poprzez wpisanie instrukcji INSERT dla brakujących rekordów w drugiej tabeli. Należy wziąć pod uwagę, że dwie porównywane tabele są tabelami z kluczami, aby uzyskać poprawny wynik, z unikalnym kluczem używanym do porównania. Jeśli usuniemy kolumnę ID unique z instrukcji SELECT po obu stronach instrukcji EXCEPT i wymienimy pozostałe kolumny niekluczowe, jak w poniższym oświadczeniu:
SELECT FirstName, LastName, Address FROM TESTDB.dbo. FirstComTable F EXCEPT SELECT FirstName, LastName, Address FROM TESTDB2.dbo. FirstComTable S
Wynik pokaże, że zwracane są tylko nowe rekordy, a zaktualizowane nie zostaną wyświetlone, jak pokazano w poniższym wyniku:
Porównaj dane tabel przy użyciu UNION ALL … GROUP BY
Instrukcja UNION ALL może być również użyta do porównania danych w dwóch tabelach na podstawie unikalnej kolumny klucza. Aby użyć instrukcji UNION ALL do zwrócenia różnicy między dwiema tabelami, należy w instrukcji SELECT wymienić kolumny do porównania i użyć tych kolumn w klauzuli GROUP BY, jak pokazano w poniższym zapytaniu T-SQL:
SELECT DISTINCT * FROM ( SELECT * FROM ( SELECT * FROM TESTDB.dbo. FirstComTable UNION ALL SELECT * FROM TESTDB2.dbo. FirstComTable) Tbls GROUP BY ID,FirstName, LastName, Address HAVING COUNT(*)<2) Diff
I tylko wiersz, który istnieje w pierwszej tabeli i został pominięty w drugiej tabeli, zostanie zwrócony, jak pokazano poniżej:
Poprzednie zapytanie również zadziała dobrze w przypadku aktualizacji rekordów, ale w inny sposób. Zwróci nowo wstawione rekordy oprócz zaktualizowanych kolumn z obu tabel, tak jak w przypadku wiersza nr 5, pokazanego poniżej:
Porównaj dane tabel przy użyciu narzędzi danych SQL Server
SQL Server Data Tools, znany również jako SSDT, zbudowany na Microsoft Visual Studio, może być łatwo używany do porównywania danych w dwóch tabelach o tej samej nazwie, w oparciu o unikalną kolumnę klucza, hostowaną w dwóch różnych bazach danych i synchronizowania danych w tych tabelach , lub wygeneruj skrypt synchronizacji do późniejszego użycia.
W otwartym oknie SSDT kliknij menu Narzędzia -> Lista SQL Server i wybierz Nowe porównanie danych opcja, jak pokazano poniżej:
W wyświetlonym oknie połączenia możesz wybrać spośród poprzednio połączonych sesji lub wypełnić okno Właściwości połączenia nazwą SQL Server, poświadczeniami i nazwą bazy danych, a następnie kliknąć Połącz , jak pokazano poniżej:
W wyświetlonym kreatorze Nowe porównanie danych określ nazwy źródłowej i docelowej bazy danych oraz opcje porównania używane w procesie porównywania tabel, a następnie kliknij Dalej , jak pokazano poniżej:
W następnym oknie podaj nazwę tabeli, która powinna być taka sama w źródłowej i docelowej bazie danych, która będzie porównywana w obu bazach danych i kliknij Zakończ , jak poniżej:
Wyświetlony wynik pokaże liczbę rekordów znalezionych w źródle i pominiętych w docelowym, znalezionych w docelowym i pominiętych w źródle, liczbę zaktualizowanych rekordów z tym samym kluczem i różnymi wartościami kolumn (Różne rekordy) i na koniec liczba identycznych rekordów znalezionych w obu tabelach, jak pokazano poniżej:
Kliknij nazwę tabeli w poprzednim wyniku, zobaczysz szczegółowy widok tych wyników, jak pokazano poniżej:
Możesz użyć tego samego narzędzia do wygenerowania skryptu do synchronizacji tabeli źródłowej i docelowej lub bezpośrednio zaktualizować tabelę docelową o brakujące lub różne zmiany, jak poniżej:
Jeśli klikniesz opcję Generuj skrypt, zostanie wyświetlona instrukcja INSERT z brakującą kolumną w tabeli docelowej, jak pokazano poniżej:
POCZĄTEK TRANSAKCJI
BEGIN TRANSACTION SET IDENTITY_INSERT [dbo].[FirstComTable] ON INSERT INTO [dbo].[FirstComTable] ([ID], [FirstName], [LastName], [Address]) VALUES (6, N'DDD', N'EEE', N'FFF') SET IDENTITY_INSERT [dbo].[FirstComTable] OFF COMMIT TRANSACTION
Wybranie opcji Aktualizuj cel poprosi Cię najpierw o potwierdzenie dokonania zmiany, jak w poniższym komunikacie:
Po synchronizacji zobaczysz, że dane w dwóch tabelach będą identyczne, jak pokazano poniżej:
Porównaj dane tabel za pomocą narzędzia innej firmy „dbForge Studio dla SQL Server”
W świecie SQL Server można znaleźć wiele narzędzi innych firm, które ułatwiają życie administratorom baz danych i programistom. Jednym z tych narzędzi, które sprawiają, że administracja bazą danych to bułka z masłem, jest dbForge Studio dla SQL Server, które zapewnia nam łatwe sposoby wykonywania zadań związanych z administracją i rozwojem bazy danych. To narzędzie może nam również pomóc w porównywaniu danych w tabelach bazy danych i synchronizacji tych tabel.
Z menu Porównanie wybierz Nowe porównanie danych opcja, jak pokazano poniżej:
W kreatorze nowego porównania danych określ źródłową i docelową bazę danych, a następnie kliknij Dalej :
Wybierz odpowiednie opcje z szerokiej gamy dostępnych opcji mapowania i porównywania, a następnie kliknij Dalej :
Podaj nazwę tabeli lub tabel, które będą uczestniczyć w procesie porównywania danych. Kreator wyświetli komunikat ostrzegawczy w przypadku wystąpienia jakichkolwiek różnic w schemacie między tabelami źródłowej i docelowej bazy danych. Kliknij Porównaj aby kontynuować:
Ostateczny wynik pokaże szczegółowo różnice w danych między tabelami źródłowymi i docelowymi, z możliwością kliknięcia aby zsynchronizować tabele źródłową i docelową, jak pokazano poniżej:
Porównaj schemat tabel przy użyciu sys.columns
Jak wspomniano na początku tego artykułu, aby zreplikować lub zarchiwizować tabelę, należy upewnić się, że schemat tabeli źródłowej i docelowej jest identyczny. SQL Server zapewnia nam różne sposoby porównywania schematów tabel w tej samej lub różnych bazach danych. Pierwsza metoda to zapytanie do widoku katalogu systemowego sys.columns, który zwraca jeden wiersz dla każdej kolumny obiektu, który ma kolumnę, z właściwościami każdej kolumny.
Aby porównać schemat tabel znajdujących się w różnych bazach danych, musisz podać w sys.columns nazwę tabeli w bieżącej bazie danych, bez możliwości udostępnienia tabeli hostowanej w innej bazie danych. Aby to osiągnąć, dwukrotnie zapytamy sys.columns, zapiszemy wynik każdego zapytania w tabeli tymczasowej i na koniec porównamy wyniki tych dwóch zapytań za pomocą polecenia EXCEPT T-SQL, jak pokazano poniżej:
USE TESTDB SELECT name, system_type_id, user_type_id,max_length, precision,scale, is_nullable, is_identity INTO #DBSchema FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.FirstComTable') GO USE TestDB2 GO SELECT name, system_type_id, user_type_id,max_length, precision,scale, is_nullable, is_identity INTO #DB2Schema FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.FirstComTable '); GO SELECT * FROM #DBSchema EXCEPT SELECT * FROM #DB2Schema
Wynik pokaże nam, że definicja kolumny adresu jest inna w tych dwóch tabelach, bez konkretnych informacji o dokładnej różnicy, jak pokazano poniżej:
Porównaj schemat tabel przy użyciu INFORMATION_SCHEMA.COLUMNS
Widok systemowy INFORMATION_SCHEMA.COLUMNS może służyć również do porównywania schematów różnych tabel, podając nazwę tabeli. Ponownie, aby porównać dwie tabele hostowane w różnych bazach danych, wykonamy zapytanie do INFORMATION_SCHEMA.COLUMNS dwa razy, zachowamy wyniki każdego zapytania w tabeli tymczasowej i na koniec porównamy wyniki tych dwóch zapytań za pomocą polecenia EXCEPT T-SQL, jak pokazano wyraźnie poniżej:
USE TestDB SELECT COLUMN_NAME, IS_NULLABLE,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION,NUMERIC_SCALE INTO #DBSchema FROM [INFORMATION_SCHEMA].[COLUMNS] SC1 WHERE SC1.TABLE_NAME='FirstComTable' GO USE TestDB2 SELECT COLUMN_NAME, IS_NULLABLE,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION,NUMERIC_SCALE INTO #DB2Schema FROM [INFORMATION_SCHEMA].[COLUMNS] SC2 WHERE SC2.TABLE_NAME='FirstComTable' GO SELECT * FROM #DBSchema EXCEPT SELECT * FROM #DB2Schema
Wynik będzie podobny do poprzedniego, pokazując, że definicja kolumny Adres jest inna w tych dwóch tabelach, bez konkretnych informacji o dokładnej różnicy, jak pokazano poniżej:
Porównaj schemat tabel za pomocą dm_exec_describe_first_result_set
Schematy tabel można również porównywać, wysyłając zapytanie do funkcji dynamicznego zarządzania dm_exec_describe_first_result_set, która przyjmuje instrukcję Transact-SQL jako parametr i opisuje metadane pierwszego zestawu wyników instrukcji.
Aby porównać schemat dwóch tabel, musisz połączyć DMF dm_exec_describe_first_result_set z samym sobą, podając instrukcję SELECT z każdej tabeli jako parametr, tak jak w poniższym zapytaniu T-SQL:
SELECT FT.name , ST.name , FT.system_type_name , ST.system_type_name , FT.max_length , ST.max_length , FT.precision , ST.precision , FT.scale , ST.scale , FT.is_nullable , ST.is_nullable , FT.is_identity_column , ST.is_identity_column FROM sys.dm_exec_describe_first_result_set (N'SELECT * FROM TestDB.DBO.FirstComTable', NULL, 0) FT LEFT OUTER JOIN sys.dm_exec_describe_first_result_set (N'SELECT * FROM TestDB2.DBO.FirstComTable', NULL, 0) ST ON FT.Name =ST.Name GO
Tym razem wynik będzie wyraźniejszy, ponieważ można naocznie porównać różnicę między dwiema tabelami, czyli rozmiar i typ kolumny Adres, jak pokazano poniżej:
Porównaj schemat tabel za pomocą narzędzi danych SQL Server
SQL Server Data Tools można również wykorzystać do porównania schematu tabel znajdujących się w różnych bazach danych. W menu Narzędzia wybierz Nowe porównanie schematów opcja z listy opcji SQL Server, jak pokazano poniżej:
Po podaniu parametrów połączenia kliknij przycisk Porównaj:
Wynik porównania pokaże w szczególności różnicę w schemacie między dwiema tabelami w postaci poleceń T-SQL CREATE TABLE, zacieniowanych jak na poniższym zrzucie ekranu:
Możesz łatwo kliknąć aby zsynchronizować schemat tabeli lub kliknij aby oskryptować zmianę i wykonać ją później, jak pokazano poniżej:
Porównaj schemat tabel za pomocą dbForge Studio dla narzędzia innej firmy SQL Server
Narzędzie dbForge Studio for SQL Server umożliwia nam porównywanie schematów różnych tabel bazy danych. Z menu Porównanie wybierz Nowe porównanie schematów opcja, jak poniżej:
Po określeniu właściwości połączenia zarówno źródłowej, jak i docelowej bazy danych, wybierz odpowiednią opcję mapowania z dostępnych opcji i kliknij Dalej :
Wybierz schematy, z którymi będziesz porównywać jego obiekt, i kliknij Dalej :
Określ tabelę lub tabele, które będą uczestniczyć w procesie porównywania schematów, i kliknij Porównaj , jeśli chcesz pominąć zmianę ustawień domyślnych w oknie Filtra obiektów, jak poniżej:
Wyświetlony wynik porównania pokaże różnicę między schematem dwóch tabel, dokładnie podświetlając część typu danych, która różni się między dwiema kolumnami, z możliwością określenia, jakie działania należy wykonać, aby zsynchronizować dwie tabele, jak pokazano poniżej :
Jeśli planujesz synchronizację schematu dwóch tabel, kliknij przycisk i określ w kreatorze synchronizacji schematu, czy uda ci się wykonać zmianę bezpośrednio na tabeli docelowej, czy po prostu oskryptuj ją do użycia w przyszłości, jak poniżej:
Przydatne linki:
- Operatory zestawów — Z WYJĄTKIEM i INTERSECT (Transact-SQL)
- Operatory zestawu — UNION (język Transact-SQL)
- Pobierz narzędzia danych SQL Server (SSDT)
- Porównaj i zsynchronizuj dane w jednej lub wielu tabelach z danymi w referencyjnej bazie danych
- sys.dm_exec_describe_first_result_set (Transact-SQL)
- sys.columns (Transact-SQL)
- Widoki schematu informacji o systemie (Transact-SQL)
Przydatne narzędzia:
dbForge Schema Compare for SQL Server – niezawodne narzędzie, które oszczędza czas i wysiłek podczas porównywania i synchronizacji baz danych na SQL Server.
dbForge Data Compare dla SQL Server – potężne narzędzie do porównywania SQL zdolne do pracy z dużymi danymi.