欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

sql server编写通用脚本自动检查两个不同服务器的新旧数据库的表结构差异

程序员文章站 2022-06-29 08:08:29
问题:工作过程中,不管是什么项目,伴随着项目不断升级版本,对应的项目数据库业务版本也不断升级,数据库出现新增表、修改表、删除表、新增字段、修改字段、删除字段等变化,如果人工检查,数据库表和字段比较多的话,工作量就非常大。 解决方案:这里博主为大家分享一个在工作过程中编写的自动检查数据库表结构版本差异 ......

问题:
工作过程中,不管是什么项目,伴随着项目不断升级版本,对应的项目数据库业务版本也不断升级,数据库出现新增表、修改表、删除表、新增字段、修改字段、删除字段等变化,如果人工检查,数据库表和字段比较多的话,工作量就非常大。

解决方案:
这里博主为大家分享一个在工作过程中编写的自动检查数据库表结构版本差异的通用脚本,只需要把新旧数据库名称批量替换成实际的名称就可以,支持通过链接服务器跨服务器检查不同服务器的两个数据库表结构差异。

脚本:

/*
    使用说明:old数据库为db_v1,new数据库为[localhost].db_v2。根据实际需要批量替换数据库名称
    脚本来源:https://www.cnblogs.com/zhang502219048/p/11028767.html
*/

-- sysobjects插入临时表
select s.name + '.' + t.name as tablename, t.* into #tempta 
from db_v1.sys.tables t
inner join db_v1.sys.schemas s on s.schema_id = t.schema_id

select s.name + '.' + t.name as tablename, t.* into #temptb 
from [localhost].db_v2.sys.tables t
inner join [localhost].db_v2.sys.schemas s on s.schema_id = t.schema_id

-- syscolumns插入临时表
select * into #tempca from db_v1.dbo.syscolumns 
select * into #tempcb from [localhost].db_v2.dbo.syscolumns

-- 第一个数据库表和字段 
select b.tablename as 表名, a.name as 字段名, a.length as 长度, c.name as 类型
into #tempa
from #tempca a
inner join #tempta b on b.object_id = a.id
inner join systypes c on c.xusertype = a.xusertype
order by b.name 
-- 第二个数据库表和字段 
select b.tablename as 表名, a.name as 字段名, a.length as 长度, c.name as 类型
into #tempb
from #tempcb a
inner join #temptb b on b.object_id = a.id
inner join systypes c on c.xusertype = a.xusertype
order by b.name

--删掉的字段
select * from    
( 
    select * from #tempa
    except
    select * from #tempb
) a;

--增加的字段
select * from    
( 
    select * from #tempb
    except
    select * from #tempa
) a;

--select * from #tempa
--select * from #tempb

drop table #tempta, #temptb, #tempca, #tempcb, #tempa, #tempb

示例旧数据库db_v1:
sql server编写通用脚本自动检查两个不同服务器的新旧数据库的表结构差异

示例新数据库db_v2:
sql server编写通用脚本自动检查两个不同服务器的新旧数据库的表结构差异

脚本运行结果:
sql server编写通用脚本自动检查两个不同服务器的新旧数据库的表结构差异

结论:
从上面几个图可以看到,表和字段的差异部分就被自动检测到了。

【转载请注明博文来源:】