sql server新旧数据库的表结构差异

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

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

脚本:

/*
    使用说明:Old数据库为DB_V1,New数据库为[localhost].DB_V2。根据实际需要批量替换数据库名称
    脚本来源:https://www.cnblogs.com/zhang502219048/p/11028767.html
*/

-- sysobjects插入临时表
select s.name + ‘.‘ + t.name as TableName, t.* into #tempTA
from DB_V1.sys.tables t
inner join DB_V1.sys.schemas s on s.schema_id = t.schema_id

select s.name + ‘.‘ + t.name as TableName, t.* into #tempTB
from [localhost].DB_V2.sys.tables t
inner join [localhost].DB_V2.sys.schemas s on s.schema_id = t.schema_id

-- syscolumns插入临时表
select * into #tempCA from DB_V1.dbo.syscolumns
select * into #tempCB from [localhost].DB_V2.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;

--select * from #tempA
--select * from #tempB

drop table #tempTA, #tempTB, #tempCA, #tempCB, #tempA, #tempB

示例旧数据库DB_V1:

示例新数据库DB_V2:

脚本运行结果:

结论:
从上面几个图可以看到,表和字段的差异部分就被自动检测到了。

【转载请注明博文来源:https://www.cnblogs.com/zhang502219048/p/11028767.html

原文地址:https://www.cnblogs.com/Leo_wl/p/11069813.html

时间: 2024-10-10 22:18:40

sql server新旧数据库的表结构差异的相关文章

修改sql server实例、数据库、表、字段的排序规则

转自:http://blog.51cto.com/jimshu/1095780 概念与详情请参考:字符编码与排序规则:https://www.cnblogs.com/gered/p/9145123.html 一.修改SQL Server服务器(实例)的排序规则 以下实验使用了SQL Server 2008 R2的默认实例,将Chinese_PRC_CI_AS修改成SQL_Latin1_General_CP1_CI_AS. 1. 停止SQL Server实例服务 2. 打开"命令提示符"

SQL Server 如何清空数据库所有表数据

1.清空SQL Server数据库中所有表数据 (1)编写存储过程脚本: CREATE PROCEDURE sp_DeleteAllDataASEXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'EXEC sp_MSForEachTable 'ALTER TABLE ? DISABLE TRIGGER ALL'EXEC sp_MSForEachTable 'DELETE FROM ?'EXEC sp_MSForEachTabl

SQL Server 动态生成数据库所有表Insert语句

一. 背景 SQL Server,如果我们需要把数据库A的所有表数据到数据库B中,通常我们会怎么做呢?我会使用SSMS的导入导出功能,进行表数据的导入导出,无可厚非,这样的导入非常简单和方便: 但是,当我们的表有上百个,而且有些表是有自增ID的,那么这个时候使用SSMS的话,你需要一个个手动设置(如图1),你要知道,需要设置上百个的这些选项是件多么痛苦的事情,而且最后很可能会因为外键约束导致导入导出失败. (图1) 虽然SSMS在导入导出的最后一步提供了生成SSIS包的功能,但是对于转移数据的需

????SQL Server中默认数据库和默认表的作用

我们知道Oracle数据库的安装架构可以是1个数据库对应1个或多个实例.而在SQL Server中,其架构和Oracle 完全相反,它是1个实例(默认实例名为Hostname主机名)下面包含多个数据库,在sqlserver数据库中(2000,2005,2008等),主要包含4个默认的数据库,分别是master数据库.model数据库.tempdb数据库和msdb数据库.这些数据库是SQL Server的心脏和灵魂.另外,还默认安装了两个实例数据库,分别是:northwind数据库和pubs数据库

(转)SQL server 2005查询数据库表的数量和表的数据量

本文转载自:http://hi.baidu.com/ajyajyajy/item/4e2a7f4dc83393d2c1a592c1 use DBNAMEgoselect * from sysobjects where xtype='U'; --这是查询所有表的信息select count(*) from sysobjects where xtype='U' --这是查询表的数量 ‍select a.name, b.rows from sysobjects a with(nolock) join

将SQL Server中的数据库导入到PowerDesigner

再用PD建表完成后导成SQL脚本然后在SQL Server中运行后生成数据库后,就想到,可不可以将直接将数据库的内容生成PD文档?经过上网查,当然可以的. 要将SQL Server中的数据库导入到PD中,首先需要建立一个数据库的链接,然后进行逆向工程的操作.下面开始操作. 第一步:打开数据库菜单,选择"Configure Connections" 第二步:创建新的ODBC链接 第三步:选择系统数据源 第四步:选择需要的数据库 第五步:"完成" 第六步:命名数据源,并

SQL语句汇总(一)——数据库与表的操作以及创建约束

首先,非常感谢大家对上篇博文的支持,真是让本菜受宠若惊,同时对拖了这么久才出了此篇表示抱歉. 前言:此文旨在汇总从建立数据库到联接查询等绝大部分SQL语句.SQL语句虽不能说很多,但稍有时间不写就容易出错.博主希望通过此文来战胜自己的健忘,如果大家认可也可以保留起来. "SQL"是 "Structured Query Language" 即“结构化查询语言”的简称,它是用来管理关系型数据库的. 其包括: –数据定义语言(DDL) –数据查询语言(DQL) –数据操作

【SQL Server】还原数据库提示“介质集有2个介质簇,但只提供了1个。必须提供所有成员”的解决办法

今天在对数据库备份与还原的过程中,我遇到一个问题"介质集有2个介质簇,但只提供了1个.必须提供所有成员",下面详细的介绍一下遇到问题的经过与问题解决的方法! 一.备份与还原遇到的问题描述与解决方法: 前两天用户测试我们做的评教系统小软件,有点问题我们过去看了看,想将他们的测试数据备份一下,以便我们修改软件测试使用. 我是这样备份的,数据库备份默认有一个路径:C\...,而我又添加了一个新路径,没将默认路径删除,而是选中新路径,我就理所当然的认为数据库中的数据备份到我新加的路径下了. 今

第七篇 SQL Server安全跨数据库所有权链接

本篇文章是SQL Server安全系列的第七篇,详细内容请参考原文. Relational databases are used in an amazing variety of applications with connections from a dizzying array of clients over widely distributed networks,特别是互联网,使得数据几乎向任何人,任何地方开放.数据库可以包含相当大部分的人类知识,包括高度敏感的个人信息和关键数据.数据库的