2011-03-10 27 views
1

我试图比较存在于不同数据库中的两个表的模式。到目前为止,我有这个疑问如何使用SQL比较两个不同数据库中的表?

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

有什么建议吗?谢谢!

回答

3

看看redgate's SQL Compare

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

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

我知道我可以用Redgate做到这一点,但我试图以编程的方式做到这一点。有没有办法通过SQL来做到这一点? – chama 2011-03-10 16:09:57

+0

@chama:编辑我的答案以解决您的原始问题。 – 2011-03-10 16:19:15

2

所有你需要的是调用OBJECT_ID功能时,如指定数据库名称和shcema:

SELECT * 
FROM DB_NAME.sys.columns 
WHERE object_id = OBJECT_ID('DB_NAME.SHCEMA_NAME.table1') 
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标准的东西,所以应该在各种DB系统上工作。有关INFORMATION_SCHEMA

的更多信息,可以发现here

0

比较对象或列无论是在两种模式中存在只是解决方案的一点点。如果它们存在于两个数据库中但是不同?

对于我的bsn ModuleStore项目,我实现了一个脚本例程,它仅使用T-SQL代码实际将大多数DB对象(包括表和视图列,索引,命名空间等)编写为XML。这可能是一个开始的好地方。您可以在Google code上找到它,并且所讨论的文件(生成用于将对象模式转储为XML的SQL查询)为here

3

晚一个,但希望有用。

即使chama问及SQL解决方案,我仍然建议使用第三方工具,如ApexSQL Diff或Red Gate Joe提到的工具(我已经使用过,他们的工作很棒)。

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

请注意,这里提到的所有示例只覆盖列,但这里显示的查询都不会显示nvarchar(20)和nvarchar(50)之间的区别或者外键或索引或...之间的区别。

简而言之,答案是肯定的 - 这可以使用信息模式视图,但如果要比较这两个表中的每个细节,可能会相当复杂。

+0

我+1这是因为Dwoolk是100%正确的。编写自己的SQL比较例程只捕获表格可能继承的所有可能对象的一个​​小窗口。使用上述工具将为您提供更广泛的表格视图,包括所有索引,触发器,约束条件等(甚至是数据到数据)的比较,以查看完整图片。我个人使用Toad for SQL Server。它有一个奇妙的SQL Schema比较,它做的很多。 – Fandango68 2014-05-13 23:45:39

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%' 
相关问题