SQL Server:比较两个表中的列

Max*_*akh 9 sql database sql-server

我最近完成了从某个应用程序的旧版本到当前版本的迁移,我在迁移数据库时遇到了一些问题.

我需要一个可以帮助我比较两个表中的列的查询.我的意思不是行中的数据,我需要比较列本身来弄清楚,我错过了表结构的哪些变化.

Gab*_*oli 12

看看Red Gate SQL Compare

否则这是一个开始(对于SQL Server)

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
Run Code Online (Sandbox Code Playgroud)

你可以看一下

 - INFORMATION_SCHEMA.TABLES
 - INFORMATION_SCHEMA.COLUMNS
 - INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
 - INFORMATION_SCHEMA.TABLE_CONSTRAINTS
 - INFORMATION_SCHEMA.KEY_COLUMN_USAGE
Run Code Online (Sandbox Code Playgroud)

桌子如果你想深入..

[更新]

使用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
Run Code Online (Sandbox Code Playgroud)


小智 8

我真的建议您使用第三方比较工具,例如上面已经提到的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'
Run Code Online (Sandbox Code Playgroud)


小智 7

这适合我(有同样的问题,只是编译我的解决方案)

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
Run Code Online (Sandbox Code Playgroud)

只需为@TableOne和@TableTwo设置值并运行脚本;)


gar*_*rik 6

真的,这是一个很大的脚本.:)

使用红门sql比较.他们为您提供14天免费试用

如果你真的需要脚本它可以是一个文本,你可以通过使用任何文本比较器来比较它们.

  • @igor是对的,不要自己写这个,有很多应用程序要做这个.Apex SQL Diff是另一个免费试用版. (2认同)