我需要一个免费工具或某种技巧/技巧来比较两个Microsoft SQL数据库的结构。最好是MS SQL 2005。
我尝试制作的技术是从两个数据库生成脚本然后比较这两个文件,但SQL Server以随机顺序生成对象。
答案 0 :(得分:8)
它只能在试用期内免费使用14天,但redgate sql compare非常好且易于使用。
答案 1 :(得分:2)
我在我的开发人员数据库中使用此工具:http://www.codeplex.com/ScriptDB。
然后我将所有文件检入svn并对生成的文件进行区分,以查看我的实时数据库中需要更改的内容。适合我。
答案 2 :(得分:1)
如果您有Visual Studio 2008(数据库版),则可以使用它来比较SQL模式。
请注意,SQL Server 2008支持需要更新:
答案 3 :(得分:1)
同样适用于RedGate SQL Compare ....我已经广泛使用它来处理非常大而复杂的数据库,并且每次都会使用它。
答案 4 :(得分:1)
看看dbForge Schema Compare for SQL Server。它不是免费软件,但有30天免费试用期,30天保证退款,而且您还有可能获得免费许可 - 请访问free license conditions page。
答案 5 :(得分:1)
我根本就不再使用SQL Server管理服务了。对于开发和测试而言,它过于陈旧和缓慢。
我使用Quest Software的TOAD for SQL Server。
它具有Schema Compare功能,可以很好地比较结构(您还可以比较数据!),它还提供了一个向导来合并两个数据库之间的差异。所有这些GUI都没有一个手动代码行控制!
GUI非常强大,拥有非常强大的数据库管理工具,包括出色的架构和数据库数据比较器。
披露:不,我不为Quest工作,但我已经使用TOAD超过10年了,而且效果很好。
答案 6 :(得分:0)
SQL Server Schema Compare对于MSSQL Express是免费的,对于完整版本是2周的试用版。
答案 7 :(得分:0)
此脚本(取自 here)可用于以粗略的方式执行此操作:
set nocount on;
-- Set the two variables newmodel and oldmodel to the appropriate database names and execute the script
declare @newmodel varchar(50), @oldmodel varchar(50);
Set @newmodel = '[NewModel to Compare]';
set @oldmodel = '[OldModel to Compare]';
Declare @Temp table (TABLE_SCHEMA varchar(40), TABLE_NAME varchar(40), COLUMN_NAME varchar(50), ORDINAL_POSITION int, IS_NULLABLE varchar(5), NullChange varchar(5), Comment varchar(50));
Declare @script varchar(5000);
set @script = '
Select nc.TABLE_SCHEMA, nc.TABLE_NAME, nc.COLUMN_NAME, nc.ORDINAL_POSITION, nc.IS_NULLABLE, IIF(nc.IS_NULLABLE <> oc.IS_NULLABLE, ''Yes'', ''No''),
IIF(oc.COLUMN_NAME IS NULL, convert(varchar(20), ''ADDED COLUMN''), convert(varchar(20), ''--'')) as Comment
from {NEW}.INFORMATION_SCHEMA.COLUMNS nc
LEFT join {OLD}.INFORMATION_SCHEMA.COLUMNS oc
on nc.TABLE_NAME = oc.TABLE_NAME and nc.COLUMN_NAME = oc.COLUMN_NAME
UNION ALL
Select oc.TABLE_SCHEMA, oc.TABLE_NAME, oc.COLUMN_NAME, oc.ORDINAL_POSITION, oc.IS_NULLABLE, ''No'', ''DELETED COLUMN'' as Comment
from {OLD}.INFORMATION_SCHEMA.COLUMNS oc
where CONCAT(oc.TABLE_NAME, ''.'', oc.COLUMN_NAME)
not in (Select CONCAT(TABLE_NAME, ''.'', COLUMN_NAME) from {NEW}.INFORMATION_SCHEMA.COLUMNS)
';
Set @script = replace(@script, '{OLD}', @oldmodel);
Set @script = replace(@script, '{NEW}', @newmodel);
--print @script
Insert into @Temp
exec(@script);
Select * from @Temp where Comment <> '--'
order by TABLE_NAME, ORDINAL_POSITION, COLUMN_NAME;
go