2010-03-11 4 views
8

Недавно я перешел с действительно старой версии приложения на текущую версию и столкнулся с некоторыми проблемами при миграции баз данных.SQL Server: сравнение столбцов в двух таблицах

Мне нужен запрос, который мог бы помочь мне сравнить столбцы в двух таблицах. Я имею в виду не данные в строках, мне нужно сравнить сами столбцы, чтобы выяснить, какие изменения в структуре таблицы я пропустил.

+0

Какие объекты db вы хотите сравнить только столбцы или столбцы и ограничения? Вправду это большой сценарий. :) Какую версию SQL Server вы используете? – garik

+0

Давайте забудем о ограничениях для простоты, я использую SQL Server 2005. И да, это огромный скрипт. –

ответ

11

посмотреть на Red Gate SQL Compare

В противном случае здесь является запуск (для SQL-сервера)

select 
so.name as [table], 
sc.name as [column], 
sc.type, sc.length, sc.prec, sc.scale, sc.collation 
from 
sysobjects so 
inner join syscolumns sc ON so.id = sc.id 

where so.type='u' 

order by so.name, sc.colorder 

вы можете посмотреть на столы в

- INFORMATION_SCHEMA.TABLES 
- INFORMATION_SCHEMA.COLUMNS 
- INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
- INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
- INFORMATION_SCHEMA.KEY_COLUMN_USAGE 

если вы хотите пойти глубже ..

[updat е]

Использование таблиц INFORMATION_SCHEMA

SELECT 
[table].TABLE_NAME AS [Table_Name], 
[column].COLUMN_NAME AS [Column_Name], 
COLUMNPROPERTY(object_id([table].[TABLE_NAME]), [column].[COLUMN_NAME], 'IsIdentity') AS [identity], 
[column].DATA_TYPE AS [datatype], 
[column].CHARACTER_MAXIMUM_LENGTH AS [Character_Length], 
[column].NUMERIC_PRECISION AS Numeric_precision, 
[column].ORDINAL_POSITION AS [order], 
[column].COLUMN_DEFAULT AS [defaultvalue], 
[column].IS_NULLABLE AS [nullable] 
FROM 
INFORMATION_SCHEMA.TABLES [table] INNER JOIN 
INFORMATION_SCHEMA.COLUMNS [column] ON [table].TABLE_NAME = [column].TABLE_NAME 
WHERE 
[table].TABLE_TYPE = 'BASE TABLE' 
AND [table].TABLE_NAME <> 'sysdiagrams' 
ORDER BY 
[table].TABLE_NAME ASC, 
[column].ORDINAL_POSITION ASC 
+0

Ницца! Большое спасибо. Я также нашел сборку в хранимой процедуре sp_columns, которая ожидает, что имя таблицы будет параметром. –

6

Действительно, это большой сценарий. :)

Используйте красный ворот sql сравнить. Они предлагают вам 14-дневную бесплатную пробную версию

Если вам действительно нужен скрипт, это может быть текст, и вы можете сравнить его с помощью любого текстового сопоставления.

+0

Я попробую. Благодарю. –

+2

@igor прав, не пишите это сами, для этого есть множество приложений. Apex SQL Diff - еще одна бесплатная пробная версия. – Tony

5

Это работает для меня (была такая же проблема, и только что собрали мое решение)

DECLARE @TableOne VARCHAR(2048) = '', 
     @TableTwo VARCHAR(2048) = '' 

-- In TableOne but not in TableTwo 
SELECT DISTINCT 
     @TableOne AS [First table], 
     '>>' AS Dir, --Direction 
     @TableTwo AS [Second table], 
     a.COLUMN_NAME, 
     a.DATA_TYPE   
    FROM INFORMATION_SCHEMA.COLUMNS a 
WHERE a.COLUMN_NAME NOT IN (SELECT COLUMN_NAME 
           FROM INFORMATION_SCHEMA.COLUMNS b 
           WHERE b.TABLE_NAME = @TableTwo) 
    AND a.TABLE_NAME = @TableOne 
UNION ALL 
-- In TableTwo but not in TableOne 
SELECT DISTINCT 
     @TableOne AS [First table], 
     '<<' AS Dir, --Direction 
     @TableTwo AS [Second table], 
     a.COLUMN_NAME, 
     a.DATA_TYPE   
    FROM INFORMATION_SCHEMA.COLUMNS a 
WHERE a.COLUMN_NAME NOT IN (SELECT COLUMN_NAME 
           FROM INFORMATION_SCHEMA.COLUMNS b 
           WHERE b.TABLE_NAME = @TableOne) 
    AND a.TABLE_NAME = @TableTwo 
ORDER BY Dir DESC, COLUMN_NAME ASC 

только заданные значения для @TableOne и @TableTwo и запустите сценарий;)

+0

Этот самый простой способ просто подключить некоторые имена таблиц без изменений. Просто будьте осторожны, вы можете увеличить ограничение на 30 символов для имен таблиц. У меня были длинные имена таблиц, и я не получил никаких результатов, пока не исправил это. – redwards510

8

Я действительно рекомендую вам использовать сторонний инструмент сравнения, такой как SQL Compare, уже упомянутый ab ove или ApexSQL Diff или в основном любой другой инструмент на рынке.

Даже если это коммерческие инструменты, вы можете получить бесплатную пробную версию и выполнить свою работу, если вам действительно не нужно делать это ежедневно.

Если вам действительно нужно использовать SQL для этого, вы можете попробовать действительно простой запрос, подобный этому, а затем построить поверх этого.

select T.name, C.* 
from sys.tables T 
inner join sys.columns C on T.object_id = C.object_id 
where T.name = 'table_name' 
Смежные вопросы