我正在尝试比较不同数据库中存在的两个表的架构。到目前为止,我有此查询
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
有什么建议吗?谢谢!
要回答您的特定问题,您需要完全限定表的引用。
SELECT * FROM db.sys.columns WHERE object_id = OBJECT_ID('db.SchemaName.table1')
后期但希望有用。
尽管chama要求使用SQL解决方案,我仍然建议您使用第三方工具,例如ApexSQL Diff或Red Gate Joe提到的工具(我已经使用了它们,并且效果很好)。
原因是使用信息模式比较两个表的查询必须非常复杂才能捕获所有差异。
注意,这里提到的所有示例仅覆盖列,但此处显示的所有查询都不会显示nvarchar(20)和nvarchar(50)之间的差异或外键或索引或…的差异。
简短的回答是,可以使用信息模式视图,但如果要比较这两个表中的每个细节,则可能会非常复杂。
您只需要在调用OBJECT_ID
函数时指定数据库名称和shcema,例如:
SELECT *
FROM DB_NAME.sys.columns
WHERE object_id = OBJECT_ID('DB_NAME.SHCEMA_NAME.table1')
尝试使用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
比较两个模式中是否存在对象或列只是解决方案的一小部分。如果它们都存在于两个数据库中却又不同,该怎么办?
对于我的bsn ModuleStore
项目,我实现了一个脚本例程,该例程实际上仅使用T-SQL代码将大多数数据库对象(包括表和视图列,索引,名称空间等)编写为XML脚本。这可能是一个不错的起点。您可以在Google code上找到它,并且所涉及的文件(该文件生成将查询对象架构转储到XML的SQL查询)为here。
代码-
如果您使用的是MS VS 2015(免费下载社区)。 SOL Server工具包括一个架构比较工具。 “ SQL Server Data Tools (SSDT) includes a Schema Compare utility that you can use to compare two database definitions”。
这是我编写的一个GPL Java程序,用于使用JDBC在任何两个异构数据库之间比较具有公共键和公共列的任何两个表中的数据:https://sourceforge.net/projects/metaqa/
这是我编写的一个GPL Java程序,用于使用JDBC在任何两个异构数据库之间比较具有公共键和公共列的任何两个表中的数据:https://sourceforge.net/projects/metaqa/