SQL Server: сравнить столбцы в двух таблицах - PullRequest
9 голосов
/ 11 марта 2010

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

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

Ответы [ 4 ]

12 голосов
/ 11 марта 2010

посмотрите на 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

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

[обновление]

Использование таблиц 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
8 голосов
/ 16 апреля 2013

Я действительно рекомендую использовать сторонний инструмент сравнения, такой как SQL Compare, уже упомянутый выше, или 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'
6 голосов
/ 11 марта 2010

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

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

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

5 голосов
/ 02 ноября 2010

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

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 и запустите скрипт;)

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