如何比较两个数据库的差异?

如何比较两个数据库的差异?,第1张

比较数据可以通过以下方式:

比较的数据库分别称为“源”和“目标”。说明:数据库项目不包含任何数据。因此,在数据比较中数据库项目不能作为源或目标。

比较数据时,会生成数据 *** 作语言 (DML) 脚本,使用该脚本可以通过更新目标数据库中的某些或全部数据来同步不同的数据库。完成数据比较后,结果会出现在 Visual Studio 的“数据比较”窗口中。有关更多信息,请参见比较数据库数据概述。说明:还可以比较两个数据库的架构或同一数据库的两个版本的架构。

比较两个数据库的架构。比较数据库数据比较两个数据库的数据在“数据”菜单上指向“数据比较”,然后单击“新建数据比较”。将出现“数据比较”向导。而且,会打开“数据比较”窗口,并且 Visual Studio 会自动为其指定一个名称,如 DataCompare1。在“数据比较”向导中,确定源数据库和目标数据库。如果“源数据库”列表或“目标数据库”列表为空,请单击“新建连接”。在“连接属性”对话框中,确定数据库所驻留的服务器以及连接数据库时将要使用的身份验证类型。然后,单击“确定”关闭“连接属性”对话框并返回到“数据比较”向导。在“数据比较”向导的第一页上,验证每个数据库的信息均是正确的,指定要在结果中包括的记录,然后单击“下一页”。“数据比较”向导的第二页将出现并显示数据库中表和视图的层次结构列表。说明:表和视图必须满足两个条件才会出现在列表中。第一个条件是,源数据库对象和目标数据库对象的架构必须匹配。第二个条件是,该列表中仅显示具有主键或唯一键的表和视图。

还可以更新目标数据库中的部分或全部数据,以与源数据库中的数据匹配。有关更多信息,请参见如何:查看数据差异和如何:同步数据库数据。

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式。

数据库有很多种类型,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用。

构建两个临时表,将两个数据库结构信息导入。

create Table #t1

(

ID Int Identity(1,1) Not Null Primary Key,

tablename nvarchar(50) NULL,

columnName nvarchar(50) NULL,

columnIndex int null,

columnType nvarchar(50) NULL

)

use 数据库1

insert into #t1

create Table #t2

(

ID Int Identity(1,1) Not Null Primary Key,

tablename nvarchar(50) NULL,

columnName nvarchar(50) NULL,

columnIndex int null,

columnType nvarchar(50) NULL

)

//开始比较

use 数据库2

insert into #t2

SELECT

SO.name as '表名',

SC.name as '表列名',

SC.colid as '索引',

ST.name as '类型'

FROM

sysobjects SO, -- 对象表

syscolumns SC, -- 列名表

systypes ST -- 数据类型表

WHERE

SO.id = SC.id

AND SO.xtype = 'U'-- 类型U表示表,V表示视图

AND SO.status >= 0 --加一个条件:SO.status >= 0,否则会将系统的临时表显示出来

AND SC.xtype = ST.xusertype

ORDER BY

SO.name, SC.colorder

go

//查询出 在t1 里有, t2 里没有的字段,查询列出来。

select * from

(

select tablename,columnName,columnType from #t1 where tablename like '%EMS_%'

EXCEPT

select tablename,columnName,columnType from #t2 where tablename like '%EMS_%'

) as c

order by tablename

比较两个数据库中表和字段的差异

-- 比较两个数据库中表的差异

-- u表,p存储过程,v视图

-- INTFSIMSNEW新库,INTFSIMS旧库

SELECT NTABLE = A.NAME, OTABLE = B.NAME

FROM INTFSIMSNEW..SYSOBJECTS A

LEFT JOIN INTFSIMS..SYSOBJECTS B

ON A.NAME = B.NAME

WHERE ISNULL(B.NAME, '') = ''

AND A.XTYPE = 'U'

UNION ALL

SELECT NTABLE = B.NAME, OTABLE = A.NAME

FROM INTFSIMS..SYSOBJECTS A

LEFT JOIN INTFSIMSNEW..SYSOBJECTS B

ON A.NAME = B.NAME

WHERE ISNULL(B.NAME, '') = ''

AND A.XTYPE = 'U'

ORDER BY 1, 2

-- 比较两个数据库中每个表字段的差异

SELECT

表名A = CASE WHEN ISNULL(A.TABLENAME, '') <>'' THEN A.TABLENAME ELSE B.TABLENAME END,

字段名A = A.FIELDNAME,

字段名B = B.FIELDNAME,

顺序= A.FIELDSNO,

说明= CASE WHEN A.FIELDTYPE <>B.FIELDTYPE THEN '类型: ' + A.FIELDTYPE + '-->' + B.FIELDTYPE

WHEN A.FIELDSNO <>B.FIELDSNO THEN '顺序: ' + str(A.FIELDSNO) + '-->' + str(B.FIELDSNO)

WHEN A.LENGTH <>B.LENGTH THEN '长度: ' + str(A.LENGTH) + '-->' + str(B.LENGTH)

WHEN A.LENSEC <>B.LENSEC THEN '小数位: ' + str(A.LENSEC) + '-->' + str(B.LENSEC)

WHEN A.ALLOWNULL <>B.ALLOWNULL THEN '允许空值: ' + str(A.ALLOWNULL) + '-->' + str(B.ALLOWNULL)

END

FROM (SELECT

TABLENAME = B.NAME,

FIELDNAME = A.NAME,

FIELDSNO = A.COLID,

FIELDTYPE = C.NAME,

LENGTH = A.LENGTH,

LENSEC = A.XSCALE,

ALLOWNULL = A.ISNULLABLE

FROM INTFSIMSNEW..SYSCOLUMNS A

LEFT JOIN INTFSIMSNEW..SYSOBJECTS B

ON A.ID = B.ID

LEFT JOIN INTFSIMSNEW..SYSTYPES C

ON A.XUSERTYPE = C.XUSERTYPE

WHERE B.XTYPE = 'U') A

FULL JOIN (SELECT

TABLENAME = B.NAME,

FIELDNAME = A.NAME,

FIELDSNO = A.COLID,

FIELDTYPE = C.NAME,

LENGTH = A.LENGTH,

LENSEC = A.XSCALE,

ALLOWNULL = A.ISNULLABLE

FROM INTFSIMS..SYSCOLUMNS A

LEFT JOIN INTFSIMS..SYSOBJECTS B

ON A.ID = B.ID

LEFT JOIN INTFSIMS..SYSTYPES C

ON A.XUSERTYPE = C.XUSERTYPE

WHERE B.XTYPE = 'U') B

ON A.TABLENAME = B.TABLENAME

AND A.FIELDNAME = B.FIELDNAME

WHERE ISNULL(A.TABLENAME, '') = ''

OR ISNULL(B.TABLENAME, '') = ''

OR A.FIELDTYPE <>B.FIELDTYPE

OR A.FIELDSNO <>B.FIELDSNO

OR A.LENGTH <>B.LENGTH

OR A.LENSEC <>B.LENSEC

OR A.ALLOWNULL <>B.ALLOWNULL

ORDER by 1, 4

如果两个数据库可以建立dblink,那么通过dblink就可以像在一个数据库一样去对比。

如果不能建立dblink,那么就只能导出两行表,通过spool导出就可以。然后通过系统级别的命令去比对。我记得linux是有比较两个文件不同行的功能的。

如果认为两个都导出比较麻烦,那就导出一个,在导入另外一个库(注意变换名字,否则表明重复就麻烦了),然后再对比。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10082774.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存