如何比较两个MS SQL数据库的结构?

时间:2009-04-22 09:38:19

标签: sql-server sql-server-2005

我需要一个免费工具或某种技巧/技巧来比较两个Microsoft SQL数据库的结构。最好是MS SQL 2005。

我尝试制作的技术是从两个数据库生成脚本然后比较这两个文件,但SQL Server以随机顺序生成对象。

8 个答案:

答案 0 :(得分:8)

它只能在试用期内免费使用14天,但redgate sql compare非常好且易于使用。

答案 1 :(得分:2)

我在我的开发人员数据库中使用此工具:http://www.codeplex.com/ScriptDB

然后我将所有文件检入svn并对生成的文件进行区分,以查看我的实时数据库中需要更改的内容。适合我。

答案 2 :(得分:1)

如果您有Visual Studio 2008(数据库版),则可以使用它来比较SQL模式。

请注意,SQL Server 2008支持需要更新:

http://www.microsoft.com/downloads/details.aspx?FamilyID=bb3ad767-5f69-4db9-b1c9-8f55759846ed&displaylang=en

答案 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