最初做一个数据库,里边一些表、存储过程、视图等等。用户也开始用了,输入了很多数据,慢慢的,由于需求提的不一样,经常要修改数据库。比如改某个字段,修改一下存储过程之类的。每次是给他们一个修改数据库文件的。只要每次按这个文件改,肯定得到的数据库是和我这边开的数据库属性保持一致的(数据库数据可以不一样)。但现在客户提出来了,有可能某些次没有进行数据库修改,导致我开发那边的数据库和他们实际用的数据库不一致,有什么办法看一不一致吗?
解决方案 »
- 自己写的数据库软件在其他电脑上不能登陆服务器
- 碰到这样一个问题!大家帮我看看!谢谢
- 有没有可视化生成SQL查询语句的工具???
- T-sql中能否在自定义函数中对表进行插入等操作
- 一个select语句的问题,麻烦大家了,在线等待
- 连续时间分组的问题
- ms server 2005数据连接
- 超级统计难题:如何分目录统计无限级目录下各目录(包括子目录)的记录数!
- 下面的提示是什么意思?
- 无法正常配置ODBC,急!!
- 程序出现对象名'xxx’无效,有偿请高手帮忙解决!急!
- 在Single_User的模式下,创建返回表的函数有时会遇到Database 'Dbname' is already open, and can only...
* 名称:两个SQLServer数据库比较
* 用途:比较数据库内对象(表、视图、函数、存储过程、触发器、约束等)、字段(数据类型及长度)
* 假设:库TABLE_A与TABLE_B是一个项目不同时期的版本数据库,由于整合的需要,那么下面的功能可能有用
* 使用:将TABLE_A、TABLE_B库的名称替换成你需要对比的两个即可F5
* 作者:黄顺龙
* 联系:[email protected]
*/create table #type(type nvarchar(50) collate Latin1_General_CI_AS_KS_WS,info nvarchar(50))
insert #type values('AF','聚合函数(CLR)');
insert #type values('C','CHECK约束');
insert #type values('D','DEFAULT(约束或独立)');
insert #type values('F','FOREIGNKEY约束');
insert #type values('PK','PRIMARYKEY约束');
insert #type values('P','SQL存储过程');
insert #type values('PC','程序集(CLR)存储过程');
insert #type values('FN','SQL标量函数');
insert #type values('FS','程序集(CLR)标量函数');
insert #type values('FT','程序集(CLR)表值函数');
insert #type values('R','规则(旧式,独立)');
insert #type values('RF','复制筛选过程');
insert #type values('SN','同义词');
insert #type values('SQ','服务队列');
insert #type values('TA','程序集(CLR)DML触发器');
insert #type values('TR','SQLDML触发器');
insert #type values('IF','SQL内联表值函数');
insert #type values('TF','SQL表值函数');
insert #type values('U','表(用户定义类型)');
insert #type values('UQ','UNIQUE约束');
insert #type values('V','视图');
insert #type values('X','扩展存储过程');
insert #type values('IT','内部表');--找出缺失对象(表、视图、函数、存储过程、触发器、约束等)
select 'TABLE_B缺少对象【'+b.info+'】:'+a.name from TABLE_B.sys.objects a,#type b where cast(a.type as nvarchar(50))=cast(b.type as nvarchar(50)) and a.name not in(
select c.name from TABLE_A.sys.objects c
)
union all
select 'TABLE_A缺少对象【'+b.info+'】:'+a.name from TABLE_A.sys.objects a,#type b where cast(a.type as nvarchar(50))=cast(b.type as nvarchar(50)) and a.name not in(
select c.name from TABLE_B.sys.objects c
)
--找出缺失表
--select 'TABLE_A无表:'+name from TABLE_B.sys.tables where type='U' and name not in (
-- select name from TABLE_A.sys.tables
--)
--union all
--select 'TABLE_B无表:'+name from TABLE_A.sys.tables where type='U' and name not in (
-- select name from TABLE_B.sys.tables
--)union all
--找出缺失字段
select 'TABLE_B..'+a.name+'表中缺少字段:'+b.name
from TABLE_B.sys.columns b,TABLE_B.sys.tables a
where a.object_id= b.object_id
and a.name in(
select e.name from TABLE_A.sys.tables e
)
and b.name not in (
select name from TABLE_A.sys.columns c where c.object_id=(select top 1 d.object_id from TABLE_A.sys.tables d where d.name=a.name)
)
union all
select 'TABLE_A..'+a.name+'表中缺少字段:'+b.name
from TABLE_A.sys.columns b,TABLE_A.sys.tables a
where a.object_id= b.object_id
and a.name in(
select e.name from TABLE_B.sys.tables e
)
and b.name not in (
select name from TABLE_B.sys.columns c where c.object_id=(select top 1 d.object_id from TABLE_B.sys.tables d where d.name=a.name)
)
union all
--找出差异字段(数据类型及长度不一致的情况)
select 'TABLE_B.dbo.'+a.name+'.'+b.name+'字段的数据类型或长度与TABLE_A库中的描述不一致' from TABLE_B.sys.tables a,TABLE_B.sys.columns b
where a.object_id= b.object_id
and a.name in(
select c.name from TABLE_B.sys.tables c
)
and b.name in(
select d.name from TABLE_B.sys.columns d where d.object_id in(
select e.object_id from TABLE_B.sys.tables e where e.name=a.name
)
)
and (
b.user_type_id !=(select top 1 f.user_type_id from TABLE_A.sys.columns f where f.name=b.name and f.object_id = (select top 1 g.object_id from TABLE_A.sys.tables g where g.name=a.name))
or b.max_length !=(select top 1 f.max_length from TABLE_A.sys.columns f where f.name=b.name and f.object_id = (select top 1 g.object_id from TABLE_A.sys.tables g where g.name=a.name))
)
union all
select 'TABLE_A.dbo.'+a.name+'.'+b.name+'字段的数据类型或长度与TABLE_B库中的描述不一致'
from TABLE_A.sys.tables a,TABLE_A.sys.columns b
where a.object_id= b.object_id
and a.name in(
select c.name from TABLE_A.sys.tables c
)
and b.name in(
select d.name from TABLE_A.sys.columns d where d.object_id in(
select e.object_id from TABLE_A.sys.tables e where e.name=a.name
)
)
and (
b.user_type_id !=(select top 1 f.user_type_id from TABLE_B.sys.columns f where f.name=b.name and f.object_id = (select top 1 g.object_id from TABLE_B.sys.tables g where g.name=a.name))
or b.max_length !=(select top 1 f.max_length from TABLE_B.sys.columns f where f.name=b.name and f.object_id = (select top 1 g.object_id from TABLE_B.sys.tables g where g.name=a.name))
)
drop table #type--sys.objects.type 类型枚举值如下:
--AF = 聚合函数 (CLR)
--C = CHECK 约束
--D = DEFAULT(约束或独立)
--F = FOREIGN KEY 约束
--PK = PRIMARY KEY 约束
--P = SQL 存储过程
--PC = 程序集 (CLR) 存储过程
--FN = SQL 标量函数
--FS = 程序集 (CLR) 标量函数
--FT = 程序集 (CLR) 表值函数
--R = 规则(旧式,独立)
--RF = 复制筛选过程
--SN = 同义词
--SQ = 服务队列
--TA = 程序集 (CLR) DML 触发器
--TR = SQL DML 触发器
--IF = SQL 内联表值函数
--TF = SQL 表值函数
--U = 表(用户定义类型)
--UQ = UNIQUE 约束
--V = 视图
--X = 扩展存储过程
--IT = 内部表
DbDiff: Database Diff and Database Scripting http://dbdiff.codeplex.com/