Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Różne sposoby porównywania schematów i danych tabel SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Utwórz profil poczty bazy danych w programie SQL Server (T-SQL)

  2. Jak sformatować datę i godzinę w SQL Server

  3. Przyznaj wybór w widoku, który nie jest tabelą podstawową, gdy tabela podstawowa znajduje się w innej bazie danych

  4. Co robi to zapytanie, aby utworzyć listę rozdzielaną przecinkami w programie SQL Server?

  5. SPRAWDŹ Ograniczenia w SQL Server