一、概述
在软件实施过程中,我遇到了这么一个问题,我在客户那边安装了整个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