Как получить список всех таблиц в двух разных базах данных
Я пытаюсь создать небольшой SQL script (в SQL Server Management Studio), чтобы получить список всех таблиц в двух разных базах данных. Цель состоит в том, чтобы выяснить, какие таблицы существуют в обеих базах данных и какие из них существуют только в одном из них.
Я нашел различные сценарии в SO, чтобы перечислить все таблицы одной базы данных, но пока мне не удалось получить список таблиц нескольких баз данных.
Итак: есть ли способ запросить SQL Server для всех таблиц в конкретной базе данных, например. SELECT * FROM ... WHERE databaseName='first_db'
, чтобы я мог присоединиться к этому с результатом для другой базы данных?
Ответы
Ответ 1
SELECT * FROM database1.INFORMATION_SCHEMA.TABLES
UNION ALL
SELECT * FROM database2.INFORMATION_SCHEMA.TABLES
UPDATE
Чтобы сравнить два списка, вы можете использовать FULL OUTER JOIN
, который покажет вам таблицы, которые присутствуют в обеих базах данных, как а также те, которые присутствуют только в одном из них:
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)
Вы также можете добавить WHERE db1.TABLE_NAME IS NULL OR db2.TABLE_NAME IS NULL
, чтобы увидеть только различия между базами данных.
Ответ 2
Насколько я знаю, вы можете запрашивать таблицы только для активной базы данных. Но вы можете сохранить их во временной таблице и присоединиться к результату:
use db1
insert #TableList select (...) from sys.tables
use db2
insert #TableList2 select (...) from sys.tables
select * from #TableList tl1 join Tablelist2 tl2 on ...
Ответ 3
Просто для полноты, это запрос, который я наконец использовал (на основе ответа Андрея М):
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
Чтобы узнать, какие таблицы существуют в db2, но не в db1, замените LEFT OUTER JOIN
на RIGHT OUTER JOIN
.