SQL Server 对比数据库差异
一、视图和存储过程比较
【原理】利用系统表“sysobjects"和系统表“syscomments”,将数据库中的视图和存储过程进行对比。系统表"sysobjects"之前有详细介绍过,有兴趣可以看看:SQL Server系统表sysobjects介绍与使用
【代码】
/*--调用示例 exec p_compdb 'DBNAME1','DBNAME2' exec p_compdb 'DBNAME2','DBNAME3' --*/ CREATE proc p_compdb @db1 sysname, --第一个库 @db2 sysname --第二个库 as exec ( ' select 类型=case isnull(a.xtype,b.xtype) when ' 'V' ' then ' '视图' ' else ' '存储过程' ' end ,匹配情况=case when a.name is null then ' '库 [' +@db1+ '] 中无' ' when b.name is null then ' '库 [' +@db2+ '] 中无' ' else ' '结构不同' ' end ,对象名称=isnull(a.name,b.name),a.text as atext, b.text as btext from( select a.name,a.xtype,b.colid,b.text from [' +@db1+ ']..sysobjects a,[' +@db1+ ']..syscomments b where a.id=b.id and a.xtype in(' 'V' ',' 'P' ') and a.status>=0 )a full join( select a.name,a.xtype,b.colid,b.text from [' +@db2+ ']..sysobjects a,[' +@db2+ ']..syscomments b where a.id=b.id and a.xtype in(' 'V' ',' 'P' ') and a.status>=0 )b on a.name=b.name and a.xtype=b.xtype and a.colid=b.colid where a.name is null or b.name is null or isnull(a.text,' '' ') <>isnull(b.text,' '' ') --group by a.name,b.name,a.xtype,b.xtype --order by 类型,匹配情况,对象名称' ) |
【执行结果】
二、数据表结构比较
【原理】利用系统表“sysobjects"、"sysindexes"、"sysindexkeys"、“syscomments”、"sysclumns"、"systypes"、"extended_properties",将数据库中的表结构进行对比。(涉及到系统表比较多。就不一一介绍。直接上代码。)
【代码】
/*--比较两个数据库的表结构差异--*/ /*--调用示例 exec p_comparestructure 'DBNAME1','DBNAME2' exec p_comparestructure 'DBNAME2','DBNAME3' --*/ create proc p_comparestructure @dbname1 varchar (250), --要比较的数据库名1 @dbname2 varchar (250) --要比较的数据库名2 as create table #tb1(表名1 varchar (250),字段名 varchar (250),序号 int ,标识 bit ,主键 bit ,类型 varchar (250), 占用字节数 int ,长度 int ,小数位数 int ,允许空 bit ,默认值 sql_variant,字段说明 sql_variant) create table #tb2(表名2 varchar (250),字段名 varchar (250),序号 int ,标识 bit ,主键 bit ,类型 varchar (250), 占用字节数 int ,长度 int ,小数位数 int ,允许空 bit ,默认值 sql_variant,字段说明 sql_variant) --得到数据库1的结构 exec ( 'insert into #tb1 SELECT 表名=d.name,字段名=a.name,序号=a.colid, 标识=case when a.status=0x80 then 1 else 0 end, 主键=case when exists(SELECT 1 FROM ' +@dbname1+ '..sysobjects where xtype=' 'PK' ' and parent_obj=a.id and name in ( SELECT name FROM ' +@dbname1+ '..sysindexes WHERE indid in( SELECT indid FROM ' +@dbname1+ '..sysindexkeys WHERE id = a.id AND colid=a.colid ))) then 1 else 0 end, 类型=b.name,占用字节数=a.length,长度=a.prec,小数位数=a.scale,允许空=a.isnullable, 默认值=isnull(e.text,' '' '),字段说明=isnull(g.[value],' '' ') FROM ' +@dbname1+ '..syscolumns a left join ' +@dbname1+ '..systypes b on a.xtype=b.xusertype inner join ' +@dbname1+ '..sysobjects d on a.id=d.id and d.xtype=' 'U' ' and d.name <>' 'dtproperties' ' left join ' +@dbname1+ '..syscomments e on a.cdefault=e.id left join sys.extended_properties g ON a.ID=g.major_id AND a.COLID=g.minor_id order by a.id,a.colorder' ) --得到数据库2的结构 exec ( 'insert into #tb2 SELECT 表名=d.name,字段名=a.name,序号=a.colid, 标识=case when a.status=0x80 then 1 else 0 end, 主键=case when exists(SELECT 1 FROM ' +@dbname2+ '..sysobjects where xtype=' 'PK' ' and parent_obj=a.id and name in ( SELECT name FROM ' +@dbname2+ '..sysindexes WHERE indid in( SELECT indid FROM ' +@dbname2+ '..sysindexkeys WHERE id = a.id AND colid=a.colid ))) then 1 else 0 end, 类型=b.name,占用字节数=a.length,长度=a.prec,小数位数=a.scale,允许空=a.isnullable, 默认值=isnull(e.text,' '' '),字段说明=isnull(g.[value],' '' ') FROM ' +@dbname2+ '..syscolumns a left join ' +@dbname2+ '..systypes b on a.xtype=b.xusertype inner join ' +@dbname2+ '..sysobjects d on a.id=d.id and d.xtype=' 'U' ' and d.name <>' 'dtproperties' ' left join ' +@dbname2+ '..syscomments e on a.cdefault=e.id left join sys.extended_properties g ON a.ID=g.major_id AND a.COLID=g.minor_id order by a.id,a.colorder' ) --and not exists(select 1 from #tb2 where 表名2=a.表名1) select 比较结果= case when a.表名1 is null and b.序号=1 then '库1缺少表:' +b.表名2 when b.表名2 is null and a.序号=1 then '库2缺少表:' +a.表名1 when a.字段名 is null and exists( select 1 from #tb1 where 表名1=b.表名2) then '库1 [' +b.表名2+ '] 缺少字段:' +b.字段名 when b.字段名 is null and exists( select 1 from #tb2 where 表名2=a.表名1) then '库2 [' +a.表名1+ '] 缺少字段:' +a.字段名 when a.标识 <>b.标识 then '标识不同' when a.主键 <>b.主键 then '主键设置不同' when a.类型 <>b.类型 then '字段类型不同' when a.占用字节数 <>b.占用字节数 then '占用字节数' when a.长度 <>b.长度 then '长度不同' when a.小数位数 <>b.小数位数 then '小数位数不同' when a.允许空 <>b.允许空 then '是否允许空不同' when a.默认值 <>b.默认值 then '默认值不同' when a.字段说明 <>b.字段说明 then '字段说明不同' else '' end , * from #tb1 a full join #tb2 b on a.表名1=b.表名2 and a.字段名=b.字段名 where a.表名1 is null or a.字段名 is null or b.表名2 is null or b.字段名 is null or a.标识 <>b.标识 or a.主键 <>b.主键 or a.类型 <>b.类型 or a.占用字节数 <>b.占用字节数 or a.长度 <>b.长度 or a.小数位数 <>b.小数位数 or a.允许空 <>b.允许空 or a.默认值 <>b.默认值 or a.字段说明 <>b.字段说明 order by isnull (a.表名1,b.表名2), isnull (a.序号,b.序号) --isnull(a.字段名,b.字段名) go |
【执行结果】
ps:以上SQL执行请采用系统管理员(sysadmin)角色账号。其他角色我没有试过,有时间可以尝试一下。当我采用只映射了库”owner"权限的账号测试时,报如下错误:拒绝了对对象 'p_compdb' (数据库 'master',架构 'dbo')的 EXECUTE 权限。
SQL Server 对比数据库差异的更多相关文章
- [SQL SERVER 2005]数据库差异备份及还原
因为之前遇到还原差异备份,最开始遇到SQLServer报错:”无法还原日志备份或差异备份,因为没有文件可用于前滚“.查阅很多资料后,终于得到解决.收集整理成这篇随笔. 问题原因:出现这种错误绝大多数是 ...
- SQL SERVER 2008数据库各版本功能对比
微软SQL SERVER 2008数据库有6个版本,分别是数据中心版.企业版.标准版.Web版.工作组版.简易版,有时候购买的时候或需要使用某项功能时,需要了解各个版本的区别,功能差异,很多时候,大部 ...
- SQL Server 2012 数据库各个版本功能对比
作为这篇SQL SERVER 2008数据库各版本功能对比 的姊妹篇,就写点SQL Server 2012 各个版本的区别以及物理以及逻辑上的限制. 个部分来分http://technet.micro ...
- 如何转换SQL Server 2008数据库到SQL Server 2005
背景介绍: 公司一套系统使用的是SQL SERVER 2008数据库,突然一天收到邮件,需要将这套系统部署到各个不同地方(海外)的工厂,需要在各个工厂部署该数据库,等我将准备工作做好,整理文档 ...
- JDBC连接SQL server与ADO.NET连接Sql Server对比
JDBC连接SQL server与ADO.NET连接Sql Server对比 1.JDBC连接SQL server 1)java方面目前有很多驱动能够驱动连接SQL servernet. 主流的有 ...
- 微软ASP.NET网站部署指南(2):部署SQL Server Compact数据库
1. 综述 对于数据库訪问,Contoso University程序要求以下的软件必须随程序一起部署.由于不属于.NET Framework: SQL Server Compact (数据库引擎) A ...
- Sql Server 2008R2 数据库发布与订阅
背景描述: 发布服务器A: (远程端) , 数据库服务名: GUANWANG1 订阅服务器B: (本机) , 数据库服务名: PC-LLRDBA 需要从服务器A中数据库发布,然后在B中订阅A发布 ...
- Data Base sql server 备份数据库
sql server 备份数据库 1.维护计划向导: 右键维护计划-维护计划向导-然后安装提示: 勾选自己要干的事,比如:完整备份数据库.差异备份数据库等等 2.作业计划: 如下图: SQL Serv ...
- SQL Server远程数据库操作(备份、还原等)
· SQL Server远程数据库备份到本地: exp sauser/sapassword@192.168.8.233:1433/DBName file=d:/backup.dmp OWNER=sum ...
随机推荐
- POJ3436 ACM Computer Factory(最大流/Dinic)题解
ACM Computer Factory Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8944 Accepted: 3 ...
- spring注解没起作用
本文为博主原创,未经允许,不得转载: 今天在写一个功能的时候,用的是springMVC的注解,当整个的功能写完在调试的时候, 从浏览器请求一直请求不到,仔细检查代码的时候也没检查出逻辑的问题,关键的问 ...
- ftp协议及vsftpd的基本应用
1.ftp协议及vsftpd的基本应用 vsftpd 是"very secure FTP daemon"的缩写,安全性是它的一个最大的特点.vsftpd 是一个 UNIX 类操作系 ...
- POJ 2104 K-th Number(主席树模板题)
http://poj.org/problem?id=2104 题意:求区间$[l,r]$的第k小. 思路:主席树不好理解啊,简单叙述一下吧. 主席树就是由多棵线段树组成的,对于数组$a[1,2...n ...
- UVa 11400 照明系统设计
https://vjudge.net/problem/UVA-11400 题意: 有一个照明系统需要用到n种灯,每种灯的电压为V,电源费用K,每个灯泡费用为C,需要该灯的数量为L.注意到,电压相同的灯 ...
- maven+nexus配置本地私有仓库
以下是settting.xml的配置 <?xml version="1.0" encoding="UTF-8"?> <settings> ...
- 【BZOJ】 3238: [Ahoi2013]差异
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3238 求:$${\sum _{i=1}^{n-1}\sum _{j=i+1}^{n}len ...
- 刚创建的maven项目,pom.xml的第一行就报错
刚创建的maven项目,马上pom.xml的第一行就报错这是第一行:<project xmlns="http://maven.apache.org/POM/4.0.0" xm ...
- pandas.read_csv参数整理
读取CSV(逗号分隔)文件到DataFrame,也支持文件的部分导入和选择迭代 更多帮助参见:http://pandas.pydata.org/pandas-docs/stable/io.html 参 ...
- Android TableLayout中的使用说明
TableLayout特点: 1)TableLayout和我们平时在网页上见到的Table有所不同,TableLayout没有边框的 2)它是由多个TableRow对象组成,每个TableRow可以有 ...