2011-07-04 25 views
12

Próbuję utworzyć mały skrypt SQL (w SQL Server Management Studio), aby uzyskać listę wszystkich tabel w dwóch różnych bazach danych. Celem jest sprawdzenie, które tabele istnieją w obu bazach danych i które istnieją tylko w jednym z nich.Jak uzyskać listę wszystkich tabel w dwóch różnych bazach danych

Znalazłem różne skrypty na SO, aby wyświetlić listę wszystkich tabel jednej bazy danych, ale jak dotąd nie udało mi się uzyskać listy tabel wielu baz danych.

A więc: czy istnieje sposób na zapytanie SQL Server o wszystkie tabele w określonej bazie danych, np. SELECT * FROM ... WHERE databaseName='first_db', abym mógł dołączyć do tego z wynikiem dla innej bazy danych?

Odpowiedz

18
SELECT * FROM database1.INFORMATION_SCHEMA.TABLES 
UNION ALL 
SELECT * FROM database2.INFORMATION_SCHEMA.TABLES 

UPDATE

W celu porównania dwóch list, można użyć FULL OUTER JOIN, który będzie pokazują tabele, które są obecne w obu bazach danych, a także te, które są obecne tylko w jednym z nich:

SELECT * 
FROM database1.INFORMATION_SCHEMA.TABLES db1 
    FULL JOIN database2.INFORMATION_SCHEMA.TABLES db2 
    ON db1.TABLE_NAME = db2.TABLE_NAME 
ORDER BY COALESCE(db1.TABLE_NAME, db2.TABLE_NAME) 

Możesz również dodać WHERE db1.TABLE_NAME IS NULL OR db2.TABLE_NAME IS NULL, aby zobaczyć tylko różnice między bazami danych.

+0

+1 Fajnie, mógłbym przysiąc, że to nie zadziałało! Działa nawet ze specyficznym dla serwera SQL 'db1.sys.tables'. – Andomar

2

O ile mi wiadomo, można tylko kwerendy tabele dla aktywnej bazy danych. Ale można je przechowywać w tabeli tymczasowej i dołącz wynik:

use db1 
insert #TableList select (...) from sys.tables 
use db2 
insert #TableList2 select (...) from sys.tables 
select * from #TableList tl1 join Tablelist2 tl2 on ... 
1

Tylko dla kompletności, to jest kwerenda w końcu używany (na podstawie odpowiedzi Andriy M.):

SELECT * FROM DB1.INFORMATION_SCHEMA.Tables db1 
    LEFT OUTER JOIN DB2.INFORMATION_SCHEMA.Tables db2 
    ON db1.TABLE_NAME = db2.TABLE_NAME 
    ORDER BY db1.TABLE_NAME 

Aby dowiedzieć się, które istnieją tabele w programie DB2, ale nie w db1 wymienić LEFT OUTER JOIN z RIGHT OUTER JOIN .

+0

Tak, i aby dowiedzieć się obu, można zamiast tego użyć polecenia "FULL OUTER JOIN". –

Powiązane problemy