如何使用SQL比较两个不同数据库中的表?

时间:2011-03-10 16:06:10

标签: sql-server sql-server-2005 tsql

我正在尝试比较不同数据库中存在的两个表的模式。到目前为止,我有这个查询

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

有什么建议吗?谢谢!

8 个答案:

答案 0 :(得分:3)

看看redgate's SQL Compare

要回答您的具体问题,您需要完全限定表格参考。

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

答案 1 :(得分:3)

迟到但希望有用。

尽管chama要求提供SQL解决方案,但我仍然建议使用第三方工具,例如ApexSQL Diff或Red Gate Joe提到的工具(我已经使用了两种工具,但它们工作得很好)。

原因是使用信息模式比较两个表的查询必须非常复杂才能捕获所有差异。

请注意,此处提到的所有示例仅涵盖列,但此处显示的查询都不会显示nvarchar(20)和nvarchar(50)之间的差异或外键或索引的差异或....

简短回答是肯定的 - 这可以使用信息架构视图,但如果要比较这两个表中的每个细节,它可能会相当复杂。

答案 2 :(得分:2)

您需要的是在调用OBJECT_ID函数时指定数据库名称和架构,例如:

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

答案 3 :(得分:1)

尝试使用information_schema。例如:

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
...

information_schema简化了所有sys.columns,sys.objects等信息的粘贴。它自动存在于您的数据库中。我认为它实际上是ISO标准的东西,所以应该在各种数据库系统上工作。

有关information_schema的更多信息,请访问here

答案 4 :(得分:0)

比较两个模式中是否存在对象或列只是解决方案的一小部分。如果它们存在于两个数据库中但又不同,该怎么办?

对于我的bsn ModuleStore项目,我实现了一个脚本例程,它实际上只使用T-SQL代码将大多数数据库对象(包括表和视图列,索引,命名空间等)作为XML脚本。这可能是一个很好的起点。您可以在Google code上找到它,并且有问题的文件(生成用于将对象模式转储为XML的SQL查询)为here

答案 5 :(得分:0)

代码 -

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%'

答案 6 :(得分:0)

以防您使用MS VS 2015(社区是免费下载)。 SOL Server工具包括模式比较工具。 “SQL Server Data Tools (SSDT) includes a Schema Compare utility that you can use to compare two database definitions”。

答案 7 :(得分:0)

这是我编写的GPL Java程序,用于使用JDBC在任意两个异构数据库之间比较任意两个表中的数据(具有公共键和公共列):https://sourceforge.net/projects/metaqa/

通过将数据类型差异简化为通用格式,可以智能地原谅(数字,字符串和日期)数据类型差异。输出是带有.xls扩展名的稀疏制表符分隔文件,用于电子表格。

程序吸收用于生成可与目标表进行比较的源表的SQL。目标表SQL可以自动生成。目标表一次只能读取一行,因此应该在公共键上进行索引。

它可以检测到两侧缺少的行以及具有其他可选列差异的公用键行。显然,元数据可以通过SQL进行访问,因此无论您是关心数据还是元数据,它仍然可以正常工作。

这在数据迁移或系统迁移项目中非常强大,并且还用于审计接口。您会惊讶于它检测到的错误数量。仍然会出现最少的误报。

Informix,Oracle和SQL-Server是第一个JDBC目标,您可以根据需要扩展该列表。