Как я могу сравнить таблицы в двух разных базах данных, используя SQL? - PullRequest
1 голос
/ 10 марта 2011

Я пытаюсь сравнить схемы двух таблиц, которые существуют в разных базах данных. Пока у меня есть этот запрос

SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('table1')

Единственное, что я не знаю, как использовать sys.columns для ссылки на базу данных, отличную от той, с которой связан запрос. Я попробовал это

SELECT * FROM db.sys.columns WHERE object_id = OBJECT_ID('table1')

но ничего не нашел.

Я использую SQL Server 2005

Есть предложения? спасибо!

Ответы [ 7 ]

3 голосов
/ 19 сентября 2013

Поздно, но, надеюсь, полезно.

Несмотря на то, что Chama попросил решения SQL, я все равно рекомендую использовать сторонние инструменты, такие как ApexSQL Diff или инструменты из Red Gate Joe, которые уже упоминались (я использовал оба, и они отлично работали).

Причина в том, что запрос для сравнения двух таблиц с использованием информационной схемы должен быть достаточно сложным, чтобы отследить все различия.

Обратите внимание, что все примеры, упомянутые здесь, охватывают только столбцы, но ни один из показанных здесь запросов не покажет разницу между nvarchar (20) и nvarchar (50) или разницу во внешних ключах или индексах или….

Краткий ответ - да - это возможно при использовании представлений информационной схемы, но это может быть довольно сложно, если вы хотите сравнить каждую деталь в этих двух таблицах.

3 голосов
/ 10 марта 2011

Взгляните на Redgate's SQL Compare .

Чтобы ответить на конкретный вопрос, вам необходимо полностью указать ссылку на таблицу.

SELECT * FROM db.sys.columns WHERE object_id = OBJECT_ID('db.SchemaName.table1')
2 голосов
/ 10 марта 2011

все, что вам нужно, это указать имя БД и shcema при вызове функции OBJECT_ID, например:

SELECT * 
FROM DB_NAME.sys.columns 
WHERE object_id = OBJECT_ID('DB_NAME.SHCEMA_NAME.table1')
1 голос
/ 10 марта 2011

Попробуйте информационную схему.Например:

select * 
from 
   db1.information_schema.columns col1
   join db2.information_schema.columns col2
     on col1.table_catalog = col2.table_catalog
     and col1.table_schema = col2.table_schema
     and col1.column_name = col2.column_name
...

Информация_схема упрощает склеивание информации из всех sys.columns, sys.objects и т. д. Она автоматически существует в вашей БД.Я думаю, что на самом деле это стандартная вещь ISO, поэтому должна работать на различных системах БД.

Более подробную информацию об information_schema можно найти здесь

0 голосов
/ 27 января 2016

На всякий случай, если вы используете MS VS 2015 (Community можно скачать бесплатно).Инструменты SOL Server включают в себя инструмент сравнения схем.« Инструменты данных SQL Server (SSDT) ​​содержат утилиту сравнения схем, которую можно использовать для сравнения двух определений базы данных ».

0 голосов
/ 22 ноября 2013

код -

drop table #a
drop table #b


select *
into #a
from [databasename1].information_schema.columns a
--where table_name = 'aaa'


select *
into #b
from [databasename2].information_schema.columns b -- add linked server name and db as needed


--where table_name = 'bbb'


select distinct( a.table_name), b.TABLE_SCHEMA+ '.' + (b.table_name) TableName,b.TABLE_CATALOG DatabaseName
from #a a


right join #b b  


on a.TABLE_NAME = b.TABLE_NAME and a.TABLE_SCHEMA = b.TABLE_SCHEMA
where a.table_name is null-- and a.table_name not like '%sync%'
0 голосов
/ 10 марта 2011

Сравнение существования объекта или столбцов в обеих схемах - лишь малая часть решения. Что если они существуют в обеих базах данных, но различаются?

Для моего bsn ModuleStore проекта я реализовал подпрограмму сценариев, которая фактически записывает сценарии для большинства объектов БД, включая столбцы таблиц и представлений, индексы, пространства имен и т. Д., В виде XML, используя только код T-SQL. Это может быть хорошим местом для начала. Вы можете найти его в Google code , а рассматриваемый файл (который генерирует SQL-запрос для выгрузки схемы объекта в XML) имеет вид здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...