您的位置:首页 > 其它

比较两个的表结构差异

2008-04-27 15:31 211 查看
/*--比较两个数据库的表结构差异

--*/
/*--调用示例

execp_comparestructure'xzkh_model','xzkh_new'
--*/

ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[p_comparestructure]')andOBJECTPROPERTY(id,N'IsProcedure')=1)
dropprocedure[dbo].[p_comparestructure]
GO

createprocp_comparestructure
@dbname1varchar(250), --要比较的数据库名1
@dbname2varchar(250) --要比较的数据库名2
as
createtable#tb1(表名1varchar(250),字段名varchar(250),序号int,标识bit,主键bit,类型varchar(250),
占用字节数int,长度int,小数位数int,允许空bit,默认值varchar(500),字段说明varchar(500))

createtable#tb2(表名2varchar(250),字段名varchar(250),序号int,标识bit,主键bit,类型varchar(250),
占用字节数int,长度int,小数位数int,允许空bit,默认值varchar(500),字段说明varchar(500))

--得到数据库1的结构
exec('insertinto#tb1SELECT
表名=d.name,字段名=a.name,序号=a.colid,
标识=casewhena.status=0x80then1else0end,
主键=casewhenexists(SELECT1FROM'+@dbname1+'..sysobjectswherextype=''PK''andnamein(
SELECTnameFROM'+@dbname1+'..sysindexesWHEREindidin(
SELECTindidFROM'+@dbname1+'..sysindexkeysWHEREid=a.idANDcolid=a.colid
)))then1else0end,
类型=b.name, 占用字节数=a.length,长度=a.prec,小数位数=a.scale, 允许空=a.isnullable,
默认值=isnull(e.text,''''''),字段说明=isnull(g.[value],'''''')
FROM'+@dbname1+'..syscolumnsa
leftjoin'+@dbname1+'..systypesbona.xtype=b.xusertype
innerjoin'+@dbname1+'..sysobjectsdona.id=d.id andd.xtype=''U''and d.name<>''dtproperties''
leftjoin'+@dbname1+'..syscommentseona.cdefault=e.id
leftjoin'+@dbname1+'..syspropertiesgona.id=g.idanda.colid=g.smallid
orderbya.id,a.colorder')

--得到数据库2的结构
exec('insertinto#tb2SELECT
表名=d.name,字段名=a.name,序号=a.colid,
标识=casewhena.status=0x80then1else0end,
主键=casewhenexists(SELECT1FROM'+@dbname2+'..sysobjectswherextype=''PK''andnamein(
SELECTnameFROM'+@dbname2+'..sysindexesWHEREindidin(
SELECTindidFROM'+@dbname2+'..sysindexkeysWHEREid=a.idANDcolid=a.colid
)))then1else0end,
类型=b.name, 占用字节数=a.length,长度=a.prec,小数位数=a.scale, 允许空=a.isnullable,
默认值=isnull(e.text,''''''),字段说明=isnull(g.[value],'''''')
FROM'+@dbname2+'..syscolumnsa
leftjoin'+@dbname2+'..systypesbona.xtype=b.xusertype
innerjoin'+@dbname2+'..sysobjectsdona.id=d.id andd.xtype=''U''and d.name<>''dtproperties''
leftjoin'+@dbname2+'..syscommentseona.cdefault=e.id
leftjoin'+@dbname2+'..syspropertiesgona.id=g.idanda.colid=g.smallid
orderbya.id,a.colorder')
--andnotexists(select1from#tb2where表名2=a.表名1)
select比较结果=casewhena.表名1isnullandb.序号=1then'库1缺少表:'+b.表名2
whenb.表名2isnullanda.序号=1then'库2缺少表:'+a.表名11
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: