SQLSERVER比较两个数据库中表和字段的差异

2016-12-11 09:25:08来源:作者:人点击

在开发过程中线上的数据库表字段和本地数据库表字段是存在的,也许我们在本地数据库中所增加的表字段都会有记录到SQL文件中,但当增加的表及字段名称较多时总会出现漏网之鱼,发布真是版本的时候回出现很多很多的问题,那么如何在发布新的版本时保证线上数据库与本地数据库中的表字段都是统一的了,下面我说一个比较笨的方法去保证两个数据库无差异。

1、将线上的数据库架构生成成为SQL,操作如下: 选择中某线上数据库 → 任务 → 生成脚本 → 下一步 → 选择对象窗口,选择(编写整个数据库及所有数据库对象的脚本)下一步 → 设置脚本编写选项窗口,输出类型选项卡中选择 “将脚本保存到特定的位置” 点击“高级”按钮,弹出 高级脚本编写选项,将出现“表/试图选项”及“常规”,在“常规选项中”找到“ 要编写脚本的数据的类型 ”项 选择 “仅限架构” 点击“确定”按钮,在文件名选项中选择文件保存的路径 → 下一步 → 下一步 → 完成 。

2、在本地新建一个数据库(数据库名称不能和将要对比的数据库名称一样),然后在新创建的数据
 

-- u表,p存储过程,v视图-- INTFSIMSNEW新库,INTFSIMS旧库 SELECT NTABLE = A.NAME, OTABLE = B.NAMEFROM INTFSIMSNEW..SYSOBJECTS A  LEFT JOIN INTFSIMS..SYSOBJECTS B    ON A.NAME = B.NAMEWHERE ISNULL(B.NAME, '') = ''  AND A.XTYPE = 'U' UNION ALL SELECT NTABLE = B.NAME, OTABLE = A.NAMEFROM INTFSIMS..SYSOBJECTS A  LEFT JOIN INTFSIMSNEW..SYSOBJECTS B    ON A.NAME = B.NAMEWHERE ISNULL(B.NAME, '') = ''  AND A.XTYPE = 'U'ORDER BY 1, 2 -- 比较两个数据库中每个表字段的差异SELECT  表名A = CASE WHEN ISNULL(A.TABLENAME, '') <> '' THEN A.TABLENAME ELSE B.TABLENAME END,  字段名A = A.FIELDNAME,  字段名B = B.FIELDNAME,  顺序= A.FIELDSNO,  说明= CASE WHEN A.FIELDTYPE <> B.FIELDTYPE THEN '类型: ' + A.FIELDTYPE + '-->' + B.FIELDTYPE              WHEN A.FIELDSNO <> B.FIELDSNO THEN '顺序: ' + str(A.FIELDSNO) + '-->' + str(B.FIELDSNO)              WHEN A.LENGTH <> B.LENGTH THEN '长度: ' + str(A.LENGTH) + '-->' + str(B.LENGTH)              WHEN A.LENSEC <> B.LENSEC THEN '小数位: ' + str(A.LENSEC) + '-->' + str(B.LENSEC)              WHEN A.ALLOWNULL <> B.ALLOWNULL THEN '允许空值: ' + str(A.ALLOWNULL) + '-->' + str(B.ALLOWNULL)         ENDFROM (SELECT        TABLENAME = B.NAME,        FIELDNAME = A.NAME,        FIELDSNO = A.COLID,        FIELDTYPE = C.NAME,        LENGTH = A.LENGTH,        LENSEC = A.XSCALE,        ALLOWNULL = A.ISNULLABLE      FROM INTFSIMSNEW..SYSCOLUMNS A        LEFT JOIN INTFSIMSNEW..SYSOBJECTS B          ON A.ID = B.ID        LEFT JOIN INTFSIMSNEW..SYSTYPES C          ON A.XUSERTYPE = C.XUSERTYPE      WHERE B.XTYPE = 'U') A  FULL JOIN (SELECT               TABLENAME = B.NAME,               FIELDNAME = A.NAME,               FIELDSNO = A.COLID,               FIELDTYPE = C.NAME,               LENGTH = A.LENGTH,               LENSEC = A.XSCALE,               ALLOWNULL = A.ISNULLABLE             FROM INTFSIMS..SYSCOLUMNS A               LEFT JOIN INTFSIMS..SYSOBJECTS B                 ON A.ID = B.ID               LEFT JOIN INTFSIMS..SYSTYPES C                 ON A.XUSERTYPE = C.XUSERTYPE             WHERE B.XTYPE = 'U') B    ON A.TABLENAME = B.TABLENAME      AND A.FIELDNAME = B.FIELDNAMEWHERE ISNULL(A.TABLENAME, '') = ''  OR ISNULL(B.TABLENAME, '') = ''  OR A.FIELDTYPE <> B.FIELDTYPE  OR A.FIELDSNO <> B.FIELDSNO  OR A.LENGTH <> B.LENGTH  OR A.LENSEC <> B.LENSEC  OR A.ALLOWNULL <> B.ALLOWNULLORDER by 1, 4

 

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台