检查两个数据库里的表名、字段是否一致的一种方法
不知道大家有没有遇到过这种情况。 程序已经给客户安装上了,并且客户已经录入了一些信息,然后程序还需要作比较大的变动(修改功能、增加模块等),数据库就不可避免要做一些改动。 但是这时候已经不能把客户的数据库删掉,换上新的数据库了。只能用添表、添字段的方式了。 如果修改程序的时候做了详细的文档的话,那么就可以按照文档来修改数据库了,但是如果没有文档,或者文档记录的不全,或者修改完成之后想检查一下有没有“漏网之鱼”。那么这时候应该怎么办呢?难道要一个一个的检查?! 我们可以使用两个视图和几个SQL语句来检查一下。 1、建立视图: 这个视图大家不太陌生吧,写过代码生成器的兄弟们都很熟悉吧。 他可以看到一个数据库里的表名、字段名、字段类型、和字段大小的信息。 建立两个这样的视图,一个读取客户的数据库,一个读取新的数据库。这样我们就有了两个数据库的表和字段的信息的列表了。 对了还有一个前提:把新的数据附加到客户的服务器上去。然后才行。 _Sys_Other_TableInfo
SELECT TOP PERCENT obj.name AS TableName, col.name AS ColName, col.xtype,
col.length
FROM 新数据库.dbo.syscolumns col INNER JOIN
新数据库.sysobjects obj ON col.id = obj.id
ORDER BY obj.name
_Sys_TableInfo
SELECT TOP PERCENT obj.name AS TableName, col.name AS ColName, col.xtype,
col.length
FROM dbo.syscolumns col INNER JOIN
.sysobjects obj ON col.id = obj.id
ORDER BY obj.name
2、执行查询语句
我们可以使用 not in 的方式来检查表名是否一致。
select * from __Sys_other_TableInfo
where tablename not in (
select tablename from _Sys_TableInfo )
执行之后会显示客户的数据库里缺少的表的名字和表里的字段。
表一致了之后,我们开始来检查字段名称。
select * from _Sys_other_TableInfo bb
where colname not in (
select colname from _Sys_TableInfo aa where aa.tablename = bb.tablename)
执行之后会显示客户的数据库里没有的字段的名称。当然是在表名一致的前提下才能进行字段的对比。
3、下面就是对照字段类型,然后字段的大小。
需要的SQL语句我还没有写出来。估计不是太难吧。
这种方法已经在我的一个项目里试验了一下,基本是正确的。
4、不过还是发现了几个问题。
1、缺少表的话可以使用企业管理器来自动生成键表语句,但是添加字段就有一点麻烦了。不知道大家有没有什么好的办法。
2、不光是检查表,还可以检查视图和存储过程(自定义函数能不能检查到还没有测试)。不过对于视图和存储过程 只能得知名称和字段、参数是否一致,如果参数没有变化,只是修改了一下内容的话就检查不出来了。
3、如果是修改表名或者是修改字段名、删除字段名就没有检查了。
- 协议森林10 魔鬼细节 (TCP滑窗管理)
- CMD魔法堂:获取进程路径和PID值的方法集
- .Net魔法堂:提取注释生成API文档
- CMD魔法堂:CMD进入指定目录
- Apache IIS Tomcat共存,配置全能服务器
- 协议森林11 涅槃 (TCP重新发送)
- CentOS6.5菜鸟之旅:关于搜索的shell命令
- 协议森林12 天下为公 (TCP堵塞控制)
- .Net魔法堂:AssemblyInfo.cs文件详解
- 本地php环境不支持curl_exec的解决办法
- JAVA魔法堂:读取.properties配置文件
- Python深入04 闭包
- PHP获取时间戳的毫秒
- Python深入03 对象的属性
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法