场景:两年前的一个项目。数据库是sqlserver。客户经常把自己数据库dump发送过来,具体数据库有什么变化也不详细说明。经常,dump导入之后,程序就各种挂。因此就需要在导入之前做一个数据库的差分。看看有哪些不一样的。数据库里有几百个表,人工做太难了。
问题:比较两个数据库所有表的结构差异。
方案:做一个小工具来完成这件事情。首先想到的是VBA,考虑效率pass,然后先利用C#,短时间也做不出来。
不过这两个方案都需要读取两个过数据库的系统表和视图。既然都是这样操作干脆直接利用存储过程做一个函数的了。
设计:想好了方案,就是利用存储过程。那就开始设计一下程序流程。
首先,需要把需要的信息分别从两个数据库的系统视图中取出来。
接着,取出来的内容做比较。
最后,把结果表示出来。
具体实施:
1,创建两个临时表,名字随便了,好区分就可以了。
2,做一个系统视图的查询sql。
2.1,需要想想我们需要哪些信息。需要表名,表字段,主键,序号,标示,类型,长度,小数据点位数,允许空,默认值等信息。
2.2,这些信息都在这些视图中sysobjects,sysindexes,systypes,syscomments,syscolumns。
2.3,最后设计连接条件,排序
3,把2中的内容分别登陆到1中创建的临时表中。
4,再写一个查询,从这两个临时表中取数据,条件是顺序,表名,字段名,标示,主键,类型,长度,小数位数,允许空,默认值。select中每个项目都需要用case when分歧判断一下。
整体的思路就是这样了。在这里只分享一下算法。
速度还是不错的。又快又准确。