检查两个数据库里的表名、字段是否一致的一种方法

不知道大家有没有遇到过这种情况。
程序已经给客户安装上了,并且客户已经录入了一些信息,然后程序还需要作比较大的变动(修改功能、增加模块等),数据库就不可避免要做一些改动。
但是这时候已经不能把客户的数据库删掉,换上新的数据库了。只能用添表、添字段的方式了。

如果修改程序的时候做了详细的文档的话,那么就可以按照文档来修改数据库了,但是如果没有文档,或者文档记录的不全,或者修改完成之后想检查一下有没有“漏网之鱼”。那么这时候应该怎么办呢?难道要一个一个的检查?!

我们可以使用两个视图和几个SQL语句来检查一下。

1、建立视图:
这个视图大家不太陌生吧,写过代码生成器的兄弟们都很熟悉吧。
他可以看到一个数据库里的表名、字段名、字段类型、和字段大小的信息。
建立两个这样的视图,一个读取客户的数据库,一个读取新的数据库。这样我们就有了两个数据库的表和字段的信息的列表了。

对了还有一个前提:把新的数据附加到客户的服务器上去。然后才行。

_Sys_Other_TableInfo

SELECT TOP 100 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 100 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、如果是修改表名或者是修改字段名、删除字段名就没有检查了。

时间: 2024-10-23 04:06:54

检查两个数据库里的表名、字段是否一致的一种方法的相关文章

sql server 查询数据库所有的表名+字段

原文:sql server 查询数据库所有的表名+字段 SELECT * FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME='Account' SELECT    (case when a.colorder=1 then d.name else '' end) as 表名,--如果表名相同就返回空       a.colorder as 字段序号,       a.name as 字段名,       (case when COLUMNPROPER

sql语句查询数据库中的表名/列名/主键/自动增长值实例_MsSql

sql语句查询数据库中的表名/列名/主键/自动增长值 ----查询数据库中用户创建的表 ----jsj01 为数据库名 select name tablename from jsj01..sysobjects where type='U' and name not in ('dtproperties') --查询表里的字段信息 ---docs为表名 ---- select * from syscolumns where id = object_id('docs') ----查询数据库中所有类型

ASP.NET MVC 如何查询其他数据库里的表

问题描述 ASP.NET MVC 如何查询其他数据库里的表 我写的Model public class DEPARTMENT { public int ID { get; set; } public string NAME { get; set; } public string TYPE { get; set; } public string DESCRIPTION { get; set; } public int CLASS { get; set; } public int SUBCLS {

java oracle-怎么在oracle用imp导入数据库前删除数据库里的表 触发器怎么写 或者java代码怎么写

问题描述 怎么在oracle用imp导入数据库前删除数据库里的表 触发器怎么写 或者java代码怎么写 // 还原 Button button_1 = new Button(composite_1, SWT.NONE); button_1.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { TableItem[] tis = table.get

eclipse中jsp能连接数据库但是访问不了数据库里面的表!!!

问题描述 eclipse中jsp能连接数据库但是访问不了数据库里面的表!!! 代码如下: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@page import="java.sql.*" %> <!DOCTYPE html PUBLIC "-//W3C//D

vbs生成ACCESS数据里所有表的字段_vbs

<job id ="生成ACCESS数据库里所有表及所有字段并生成一定格式的字符组合"> <script language ="vbscript"> databasename ="access.mdb"''数据库地址 tablename ="blogarticle"''要处理的表名 Set conn = CreateObject("ADODB.Connection") connstr

sql语句查询数据库中的表名/列名/主键/自动增长值

----查询数据库中用户创建的表 ----jsj01 为数据库名 select name tablename from jsj01..sysobjects where type='U' and name not in ('dtproperties') --查询表里的字段信息 exec sp_help  对象名 ---docs为表名 ---- select * from syscolumns where id = object_id('docs') ----查询数据库中所有类型 ----selec

一个页面中的表格里需显示两个数据库里数据

问题描述 现在我需要一个页面上显示2个数据库里的数据,A数据库里的a表和B数据库里的b表,a.no=b.no,这就是2个表的关联关系我现在需要把这两个表的信息一一对应的显示在一个页面的表格上求指导,最好代码示例下有没有谁做过类似的例子,我是.NETC#做的数据库是SQL2000如果做过可以发我邮件caoyao0622@126.con 解决方案 解决方案二:好像要用到linkedserver,你可以去mssql版区问一下.也可以在csdn搜索一下,应该很多.解决方案三:innerjoinselec

更改MYSQL数据库不区分大小写表名

今天郁闷死了,在LINUX下调一个程序老说找不到表,但是我明明是建了表的,在MYSQL的命令行下也可以查到,为什么程序就找不到表呢? 后来请教了一个老师才搞定,原来是LINUX下的MYSQL默认是要区分表名大小写的,哎,弄了那么旧,害死我了. 让MYSQL不区分表名大小写的方法其实很简单: 1.用ROOT登录,修改/etc/my.cnf 2.在[mysqld]下加入一行:lower_case_table_names=1 3.重新启动数据库即可.