数据库表结构比对工具

本文介绍了一个在软件实施中为减轻工作负担而编写的数据库表结构比对工具。工具设计包括获取表结构SQL,对比不同数据库的表结构,并在目标数据库中添加缺失字段。文章详细阐述了实现过程,提供了SQL脚本示例。
摘要由CSDN通过智能技术生成

一、概述

       在软件实施过程中,我遇到了这么一个问题,我在客户那边安装了整个ERP程序并且向数据库中导入了客户提供给我的基础资料,程序进入试运行阶段,在试运行期间,客户反映出程序的各种问题,需要提交给公司去纠正这些问题,在纠正问题的时候伴随的问题的解决,程序开发人员向数据库中添加了数据库表或者向已有表中添加了字段,这个时候开发员没有一个良好的习惯用SQL语法来操作这些添加,而是直接在数据库设计器中添加,在实施人员给客户更新程序的时候需要重新还原数据库,导致之前已经导入的基础资料需要重新做处理,做了重复工作量,我作为一个实施人员为了让自己工作更轻松,编写了这么一个小工具,网上搜索了一下,很多这种的小工具但是并不适合我,自己动手丰衣足食,接下来我们探讨一下这个小工具的实现。

二、小工具设计思路

      需要两个数据库进行比较,那么我们需要两个不同的数据库甚至连接两个不同的数据库服务器,针对不同的数据库服务器中的两个数据库进行表结构比对(大家可以考虑存储过程,函数等的比对,比对过程都不会难),想到这些我们就可以开始着手开始设计程序了,设计界面如下图所示:

三、程序设计

获取表结构的SQL语法:

USE DBName--换成你自己的数据库名称

SELECT distinct 表名 = OBJECT_NAME(c.object_id),
                    表描述 = (SELECT top 1 a.[value] FROM sys.extended_properties a left JOIN  sysobjects b ON a.major_id=b.id WHERE b.name=OBJECT_NAME(c.object_id) and a.minor_id=0 ),
                    字段名 = c.name, 字段描述 = ex.value, 字段类型 = t.name, 字段长度 = c.max_length, 位数 = c.precision, 小数位 = c.scale
                    FROM sys.columns c LEFT OUTER JOIN sys.extended_properties ex
                    ON ex.major_id = c.object_id AND ex.minor_id = c.column_id AND ex.name = 'MS_Description'
                    left outer join systypes t on c.system_type_id = t.xtype WHERE
                    OBJECTPROPERTY(c.object_id, 'IsMsShipped') = 0 AND
                    t.name != 'sysname'

编写一个方法放入上述SQL 返回一个datatable。

获取数据库中表的创建语法:

USE DBName--此处替换为你自己的数据库名称

SET ARITHABORT ON
SET CONCAT_NULL_YIELDS_NULL ON
SET QUOTED_IDENTIFIER ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
SET NUMERIC_ROUNDABORT OFF

declare @crlf char(2)
SET @crlf=char(13)+char(10)

;WITH ColumnDefs as
(
    select TableObj=c.[object_id]
        ,ColSeq=c.column_id
        ,ColumnDef=quotename(c.Name)+' '
                    +case
                        when c.is_computed=1 then 'as '+coalesce(k.[definition],'')
                            +case when k.is_persisted=1 then ' PERSISTED'+case when k.is_nullable=0 then ' NOT NULL' else '' end else '' end
                        else DataType
                            +case
                            when DataType in ('decimal','numeric') then '('+cast(c.precision as varchar(10))+case when c.scale<>0 then ','+cast(c.scale as varchar(10)) else '' end +')'
                            when DataType in ('char','varchar','nchar','nvarchar','binary','varbinary') then '('+case when c.max_length=-1 then 'max' else case when DataType in ('nchar','nvarchar') then cast(c.max_length/2 as varchar(10)) else cast(c.max_length as varchar(10)) end end +')'
                            when DataType='float' and c.precision<>53 then '('+cast(c.precision as var

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值