如何用SQL自动检查不同数据库中表的差异

简介: SQL数据库开发

问题描述:

工作过程中,不管是什么项目,伴随着项目不断升级版本,对应的项目数据库业务版本也不断升级,数据库出现新增表、修改表、删除表、新增字段、修改字段、删除字段等变化,如果人工检查,数据库表和字段比较多的话,工作量就非常大。


解决方案:
这里为大家分享一个在工作过程中编写的自动检查数据库表结构版本差异的通用脚本,只需要把新旧数据库名称批量替换成实际的名称就可以,支持通过链接服务器跨服务器检查不同服务器的两个数据库表结构差异。


具体脚本:

使用说明:Old数据库为SQL_Road1,New数据库为[localhost].SQL_Road2。根据实际需要批量替换数据库名称,其中[localhost]也可以改成远程数据库IP地址。

sys.objects插入临时表

SELECT
  s.name + '.' + t.name AS TableName,
  t.* INTO #tempTA
FROM
  SQL_Road1.sys.tables t
INNER JOIN SQL_Road1.sys.schemas s
ON s.schema_id = t.schema_id
SELECT
  s.name + '.' + t.name AS TableName,
  t.* INTO #tempTB
FROM
  [localhost].SQL_Road2.sys.tables t
INNER JOIN [localhost].SQL_Road2.sys.schemas s
ON s.schema_id = t.schema_id



sys.columns插入临时表

SELECT
  * INTO #tempCA
FROM
  SQL_Road1.dbo.syscolumns 
SELECT
  * INTO #tempCB
FROM
  [localhost].SQL_Road2.dbo.syscolumns



第一个数据库表和字段

SELECT
  b.TableName AS 表名,
  a.name AS 字段名,
  a.length AS 长度,
  c.name AS 类型 INTO #tempA
FROM
  #tempCA a
INNER JOIN #tempTA b ON b.object_id = a.id
INNER JOIN systypes c ON c.xusertype = a.xusertype
ORDER BY  b.name



第二个数据库表和字段

SELECT
  b.TableName AS 表名,
  a.name AS 字段名,
  a.length AS 长度,
  c.name AS 类型 INTO #tempB
FROM
  #tempCB a
INNER JOIN #tempTB b ON b.object_id = a.id
INNER JOIN systypes c ON c.xusertype = a.xusertype
ORDER BY  b.name



删掉的字段

SELECT  *
FROM
(
  SELECT  * FROM  #tempA
  EXCEPT
  SELECT  * FROM  #tempB
) a;



增加的字段

SELECT  * FROM
(
  SELECT  * FROM  #tempB
  EXCEPT
  SELECT  * FROM  #tempA
) a;



这样我们就将两个数据库中表结构的差异比对出来了,当然这一般在数据同步过程中可能才会用到。

相关文章
|
SQL 大数据 HIVE
电商项目之交易订单明细流水表 SQL 实现(上)|学习笔记
快速学习电商项目之交易订单明细流水表 SQL 实现(上)
电商项目之交易订单明细流水表 SQL 实现(上)|学习笔记
|
JavaScript
pikachu靶场通关秘籍之跨站脚本攻击
pikachu靶场通关秘籍之跨站脚本攻击
259 0
|
监控 应用服务中间件 nginx
一个抛砖引玉的nginx监控大盘
一个抛砖引玉的nginx监控大盘
|
SQL 搜索推荐 关系型数据库
mysql 分页offset过大性能问题解决思路
mysql 分页offset过大性能问题解决思路
312 0
|
Web App开发 人工智能 JavaScript
高性能RISC-V芯片平台“无剑600”正式发布
8月24日,在2022 RISC-V中国峰会上,阿里平头哥发布首个高性能RISC-V芯片平台“无剑600”及SoC原型“曳影1520”,首次兼容龙蜥Linux操作系统并成功运行LibreOffice,刷新全球RISC-V一系列纪录。
850 0
高性能RISC-V芯片平台“无剑600”正式发布
|
人工智能 索引 Python
【Python 百炼成钢】八数码、九宫格问题
【Python 百炼成钢】八数码、九宫格问题
【Python 百炼成钢】八数码、九宫格问题
Maven工程的类型和结构
Maven工程的类型和结构
|
JavaScript
【重温基础】instanceof运算符
【重温基础】instanceof运算符
178 0
|
小程序 搜索推荐 物联网
IoT 小程序开发及刷脸支付实现
从设备角度上说,IoT 小程序也是一种实现 IoT 设备二次开发的方法。类似支付宝小程序,IoT 小程序开放了一系列的 API 和组件。开发者可以快速开发一个IoT 小程序,定制 IoT 设备功能,满足各行业个性化的需求。
IoT 小程序开发及刷脸支付实现