2012-11-22 12 views
5

Mam wymóg porównania różnych kolumn tabel z 2 różnych baz danych, aby dodać kolumny do tabel głównych na podstawie wymagania.Porównaj 2 różne tabele kolumn z 2 różnych baz danych

Na przykład:

Przyjmijmy w bazie danych master Stworzyłem jeden stół jak:

create table test(id int,name varchar(10)) 

Przyjmijmy w bazie testowej Stworzyłem jeden stół jak

create table testings(id int,name varchar(20), sal int) 

teraz muszę porównaj 2 kolumny tabeli

Nie chcę używać narzędzi z czerwoną bramą.

Czy ktoś może mi pomóc?

Odpowiedz

8

Można do tego celu użyć operatorów zestawu EXCEPT or INTERSECT. Tak:

SELECT id, name FROM master.dbo.test 
EXCEPT -- or INTERSECT 
SELECT id, name FROM test.dbo.testings 

to daje:

  • wyjątkiem: zwrotów wszelkie odrębne wartości z lewej zapytania, które nie są znaleźć także na prawym zapytania.

  • INTERSECT: powraca jakieś odrębne wartości, które są zwracane przez kwerendy zarówno po lewej i prawej stronie operandu przecinać.

W twoim przypadku, ponieważ chcesz wybrać z dwóch różnych baz danych, trzeba użyć w pełni kwalifikowanej nazwy tabel. Muszą być w postaci database.schema.object_name.

Aktualizacja: Jeśli chcesz porównać dwie tablice kolumny nazwy, nie samych danych, trzeba pracować z tabel metadanych porównać nazwy kolumn w ten sam sposób z EXCEPT.

Na przykład załóżmy, że masz dwie bazy danych:

  • Test baza danych zawiera tabelę:

    create table test(id int, name varchar(10), dep varchar(50)); 
    

    i innej bazy danych:

  • anotherdatabase baza danych zawiera tabela:

    create table testings(id int,name varchar(20), sal int); 
    

I chcesz porównać dwie tabele kolumny i dostać tabele, które nie istnieją w innej tabeli, w naszym przykładzie trzeba dostać sal i dep.

Następnie można to zrobić:

SELECT ColumnName 
FROM 
(
    SELECT c.name "ColumnName" 
    FROM test.sys.tables t 
    INNER JOIN test.sys.all_columns c 
      ON t.object_id = c.object_id 
    INNER JOIN test.sys.types ty 
      ON c.system_type_id = ty.system_type_id 
    WHERE t.name = 'test' 
    EXCEPT 
    SELECT c.name 
    FROM anotherdatabase.sys.tables t 
    INNER JOIN anotherdatabase.sys.all_columns c 
      ON t.object_id = c.object_id 
    INNER JOIN anotherdatabase.sys.types ty 
      ON c.system_type_id = ty.system_type_id 
    WHERE t.name = 'testings' 
) t1 
UNION ALL 
SELECT ColumnName 
FROM 
(
    SELECT c.name ColumnName 
    FROM anotherdatabase.sys.tables t 
    INNER JOIN anotherdatabase.sys.all_columns c 
      ON t.object_id = c.object_id 
    INNER JOIN anotherdatabase.sys.types ty  
      ON c.system_type_id = ty.system_type_id 
    WHERE t.name = 'testings' 
    EXCEPT 
    SELECT c.name 
    FROM test.sys.tables t 
    INNER JOIN test.sys.all_columns c 
      ON t.object_id = c.object_id 
    INNER JOIN test.sys.types ty 
      ON c.system_type_id = ty.system_type_id 
    WHERE t.name = 'test' 
) t2; 

To powinno dać:

enter image description here

zauważyć, że: Dołączyłem tabele:

z tabelą:

dostać tylko te kolumny, które mają ten sam typ danych. Jeśli nie dołączyłeś do tej tabeli, jeśli dwie kolumny mają tę samą nazwę, ale inny typ danych, będą one takie same.

+0

Cześć Mahmoud Gamel, dziękuję za udzielenie odpowiedzi, pamiętaj, że zawsze ustawiony operator działa na wiersz mądry, a nie kolumny mądry.moim wymaganiem jest to, że muszę porównać 2 kolumny tabeli, jeśli jakakolwiek tabela ma mniej kolumn niż inny, muszę zidentyfikować tę nazwę kolumny i muszę ją dodać. mam nadzieję, że jesteś nieporuszony. – Franklin

+0

@ user1694000 - Przepraszamy za nieporozumienie. Więc chcesz uzyskać nazwy kolumn, których nie ma w żadnym z nich. Dobrze? Tylko nazwy kolumn. –

+0

@ user1694000 - Zobacz moją edycję. –

1

Aby porównać kolumny, należy użyć tabeli INFORMATION_SCHEMA.COLUMNS w Serwerze SQL.

To exmaple:

select column_name from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='your_table_name1' 
except 
select column_name from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='your_table_name2' 
11

jest to tylko narzędzia czerwono-gate nie chcą korzystać lub w zasadzie dowolne narzędzie strona trzecia? Dlaczego nie, nawet jeśli nie masz budżetu na zakup, możesz nadal używać tego w trybie próbnym, aby wykonać zadanie?

Używamy narzędzia Apex Diff, ale jest tam o wiele więcej.

Przy tak wielu dostępnych narzędzi prawdopodobnie można uruchomić wszystkie, jeden po drugim w trybie próbnym dla miesięcy ...

Znając tabele systemowe i jak to zrobić natywnie jest super, ale to jest po prostu zbyt czasochłonne ...

Powiązane problemy