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

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

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

    2、在本地新建一个数据库(数据库名称不能和将要对比的数据库名称一样),然后在新创建的数据库中执行第一个步保存的文件。

    3、开始对比两个数据库,执行如下SQL语句,如下SQL语句中INTFSIMSNEW 表示新数据库(线上数据库,也就是刚刚第二步新建的数据库),INTFSIMS 表示旧数据库(本地数据库),将如下SQL语句中所有 INTFSIMSNEW 替换成你新建的数据库名称,INTFSIMS 替换成你本地的数据库名称
-- u表,p存储过程,v视图
-- INTFSIMSNEW新库,INTFSIMS旧库

SELECT NTABLE = A.NAME, OTABLE = B.NAME
FROM INTFSIMSNEW..SYSOBJECTS A
  LEFT JOIN INTFSIMS..SYSOBJECTS B
    ON A.NAME = B.NAME
WHERE ISNULL(B.NAME, ‘‘) = ‘‘
  AND A.XTYPE = ‘U‘

UNION ALL

SELECT NTABLE = B.NAME, OTABLE = A.NAME
FROM INTFSIMS..SYSOBJECTS A
  LEFT JOIN INTFSIMSNEW..SYSOBJECTS B
    ON A.NAME = B.NAME
WHERE 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)
         END
FROM (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.FIELDNAME
WHERE 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.ALLOWNULL
ORDER by 1, 4

  


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

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

    2、在本地新建一个数据库(数据库名称不能和将要对比的数据库名称一样),然后在新创建的数据库中执行第一个步保存的文件。

    3、开始对比两个数据库,执行如下SQL语句,如下SQL语句中INTFSIMSNEW 表示新数据库(线上数据库,也就是刚刚第二步新建的数据库),INTFSIMS 表示旧数据库(本地数据库),将如下SQL语句中所有 INTFSIMSNEW 替换成你新建的数据库名称,INTFSIMS 替换成你本地的数据库名称
-- u表,p存储过程,v视图
-- INTFSIMSNEW新库,INTFSIMS旧库

SELECT NTABLE = A.NAME, OTABLE = B.NAME
FROM INTFSIMSNEW..SYSOBJECTS A
  LEFT JOIN INTFSIMS..SYSOBJECTS B
    ON A.NAME = B.NAME
WHERE ISNULL(B.NAME, ‘‘) = ‘‘
  AND A.XTYPE = ‘U‘

UNION ALL

SELECT NTABLE = B.NAME, OTABLE = A.NAME
FROM INTFSIMS..SYSOBJECTS A
  LEFT JOIN INTFSIMSNEW..SYSOBJECTS B
    ON A.NAME = B.NAME
WHERE 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)
         END
FROM (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.FIELDNAME
WHERE 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.ALLOWNULL
ORDER by 1, 4
时间: 2024-12-18 20:30:51

SQL SERVER 比较两个数据库中表和字段的差异的相关文章

使用Red Gate Sql Compare 数据库同步工具进行SQL Server的两个数据库的结构比较、同步

将测试版的项目同步(部署)到正式版的时候,两个数据库的结构比较与同步时,如果修改数据库的时候没有记录好修改了那些表,很难将两个数据库进行同步 RedGate Sql Compare使用简介说明: 1.比对并同步数据库中的所有对象 包括存储过程.关系.表.视图和用户定义的函数 2.报告所有差异 3.生成直接在目标数据库上运行的迁移脚本 Red gate sql compare 官网:http://www.red-gate.com/products/sql-development/sql-compa

比较两个数据库中表的不同

二.数据表结构比较 [原理]利用系统表“sysobjects"."sysindexes"."sysindexkeys". “syscomments”."sysclumns"."systypes"."extended_properties",将数据库中的表结构进行对 比.(涉及到系统表比较多.就不一一介绍.直接上代码.) [代码] /*--比较两个数据库的表结构差异--*/ /*--调用示例 exe

Sql Server R2还有备份数据库错误

错误信息描述  该数据库是运行版本10.50.1600的服务器上备份的.该版本与此服务器(运行版本10.00.1600)不兼容.请在支持该被份的服务器上还原该数据,  或者使用与此服务器兼容的备份(MicrosoftSqlServer.Smo) 错误原因  本机上两个数据库一个是sql server版本,另个就sql server r2版本.  数据备份文件应该在sql server r2版本上附加而,我的sql server r2版本登陆所用的实例是sql server版本的所以引发数据还原不

SQL Server 在多个数据库中创建同一个存储过程(Create Same Stored Procedure in All Databases)

原文:SQL Server 在多个数据库中创建同一个存储过程(Create Same Stored Procedure in All Databases) 一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 遇到的问题(Problems) 实现代码(SQL Codes) 方法一:拼接SQL: 方法二:调用模板存储过程创建存储过程: 总结 扩展阅读 参考文献(References) 二.背景(Contexts) 在我的数据库服务器上,同一个实例

Sql Server来龙去脉系列之四 数据库和文件

在讨论数据库之前我们先要明白一个问题:什么是数据库? 数据库是若干对象的集合,这些对象用来控制和维护数据.一个经典的数据库实例仅仅包含少量的数据库,但用户一般也不会在一个实例上创建太多的数据库.一个数据库实例最多能创建32767个数据库,但是按照实际情况,一般设计是不会达到这个限制值. 为了更明显地说明数据库,数据库包含了以下属性和功能: *. 它是很多对象的集合,比如表.视图.存储过程.约束.对象集合的最大值是2(31) - 1(超过2百亿).一般对象的数量在几百至一万. *. 它维持拥有的用

SQL Server 2008 R2 附加数据库 “尝试打开或创建物理文件 拒绝访问”的解决办法

其实是来自一篇SQL Server 2005同样错误的帖子,不过试了在SQL Server 2008 R2下面也有效,记录一下. 解决方法: 在所有程序—Microsoft SQL Server 2008 R2—配置工具—SQL Server 配置管理器,点击"SQL Server 服务",右边会显示正在运行的服务,以及对应的用户,右击SQL Server (MSSQLSERVER),选择“属性”,把内置帐户选择为"Local System",点击重新启动就OK了.

使用SQL Server Management Studio 创建数据库备份作业

SQL Server 作业无非就是按照规定的时间执行指定的脚本,这里介绍如何用SSMS(SQL Sever 2008)创建作业备份数据库. (0)假设在创建作业之前你所要备份的数据库已经存在:其次,你已经会启动SQL Sever 代理(一般是关闭的) (1)创建SQL Server代理作业 (1.1)新建作业,输出常规信息 如上图:输入作业名称(如:BackupJobTest),这里所有者和类别都是默认的,输入说明(就跟写代码要写注释一样,利人利己) (1.2)设置作业执行步骤 点击左边“选择页

sql server 判断是否存在数据库,表,列,视图

1 判断数据库是否存在if exists (select * from sys.databases where name = '数据库名')    drop database [数据库名] 2 判断表是否存在if exists (select * from sysobjects where id = object_id(N'[表名]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)    drop table [表名] 3 判断存储过程是否存在if ex

Sql Server Compact 4.0数据库部署安装

Sql Server Compact 4.0相比3.5版本增强了很多,支持Entity Framework 4.1,对于轻量级应用来讲,使用Sql Server Compact 4.0是个很好的选择,而且部署相当方便,不需要 Sql Server Compact 4.0的安装包,仅需要发布相关的dll以及web.config配置即可. 开发环境下,需要安装 vs2010 sp1 Microsoft SQL Server Compact 4.0 Visual Studio 2010 SP1 Too