对比库表结构,生成SQL
网上找了一圈对比库的工具,能手工生成差别的SQL的工具没有,改造了一下网上的sql
1, 获取字段名的类型
create FUNCTION [dbo].[getColType](@tab varchar(100),@col varchar(100))
Returns nvarchar(100)
BEGIN
Declare @lx VARCHAR(100)
Declare @Length INT
Declare @Scale int
Declare @code nvarchar(32) SELECT @lx = b.name,
@Length = COLUMNPROPERTY(a.id,a.name,'PRECISION'),
@Scale = isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) FROM
syscolumns a
left join
systypes b
on
a.xusertype=b.xusertype
inner join
sysobjects d
on
a.id=d.id and d.xtype='U' and d.name<>'dtproperties'
left join
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
left join sys.extended_properties f
on
d.id=f.major_id and f.minor_id=0
where
d.name=@tab --如果只查询指定表,加上此条件
AND a.name=@col
SET @code=@lx
IF @lx LIKE 'decimal'
SET @code =@lx+'('+ CAST(@Length AS VARCHAR(10))+','+CAST(@Scale AS VARCHAR(10)) +')'
IF @lx LIKE '%varchar'
BEGIN
IF @Length=-1
SET @code =@lx+'(max)'
ELSE
SET @code =@lx+'('+ CAST(@Length AS varchar(10))+')'
end
Return @code
end
2 对比生成SQL,这个存储过程特定情况的,网友要用,需要手工改造一下
create proc
[dbo].[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 * INTO #diff FROM (SELECT 比较结果,表名1,字段名1, CAST(默认值1 AS VARCHAR(300)) 默认值11 FROM (
select 比较结果=case when a.表名1
is null and b.序号=1
then '线上库缺少表:'+b.表名2
when b.表名2
is null and a.序号=1
then '线下库缺少表:'+a.表名1
when a.字段名
is null and exists(select 1
from #tb1
where 表名1=b.表名2)
then '线上库 ['+b.表名2+'] 缺少字段:'+b.字段名
when b.字段名
is null and exists(select 1
from #tb2
where 表名2=a.表名1)
then '线下库缺少字段:'+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,
a.表名1, a.字段名 字段名1,b.表名2, b.字段名 字段名2,a.默认值 默认值1,b.默认值 默认值2
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.字段说明
) t1 WHERE (t1.比较结果 LIKE ('%线下库%') OR t1.比较结果 LIKE ('%默认值%') ) AND t1.比较结果 NOT like '%Sequence_20151207' ) t; SELECT * FROM #diff
DECLARE @diff VARCHAR(300)
DECLARE @tabname VARCHAR(300)
DECLARE @colname VARCHAR(300)
DECLARE @defaultvalue VARCHAR(300) DECLARE cursors CURSOR
FOR SELECT * FROM #diff --查询集合 OPEN cursors
FETCH NEXT FROM cursors INTO @diff, @tabname,@colname,@defaultvalue
WHILE @@fetch_status = 0
BEGIN
--遍历集合
IF @diff LIKE '%线下库缺少表%'
BEGIN
PRINT ' select * into '+@tabname+' from [b_Online]..'+@tabname
PRINT 'GO'
END
IF @diff LIKE '%线下库缺少字段%'
BEGIN
PRINT ' alter table '+@tabname+' add '+@colname+' '+dbo.getColType(@tabname,@colname)
PRINT 'GO'
END
IF @diff LIKE '%默认值不同%'
BEGIN
IF @defaultvalue<>''
BEGIN
PRINT ' alter table [' + @tabname + '] ADD DEFAULT ' + @defaultvalue + ' FOR [' + @colname + ']'
PRINT 'GO'
END
END --EXEC(@sql)
FETCH NEXT FROM cursors INTO @diff, @tabname,@colname,@defaultvalue
END
CLOSE cursors
deallocate cursors
执行: exec p_comparestructure 'b_Online','b_Offline' 生成的SQL在Print 信息里。
对比库表结构,生成SQL的更多相关文章
- (转载)根据数据字典表定义的表结构,生成创建表的SQL语句
<来源网址:http://www.delphifans.com/infoview/Article_221.html>根据数据字典表定义的表结构,生成创建表的SQL语句 //1. 类名:T ...
- linux mysql-workbench 创建与正式库表结构一样的表
先在本地创建数据库 字符集选择这个 创建数据库成功 创建与正式库一样的表 step1: 连接正式库,找到要生成的表,导出创建表的sql语句 step2: 找到本地数据库,选择表,在sql执行区域复制s ...
- 如何将excel 数据库表结构生成powerdesign物理模型
Option Explicit Dim mdl ' the current model Set mdl = ActiveModel If (mdl Is Nothing) Then MsgBox &q ...
- [sql] 同库表(结构)的备份和sql聚合&navicat使用
同库表的备份-赋值表结构和数据SQL语句 参考 有时候我们处理某个表时,需要先备份下这个表到当前这个库,然后再执行sql. 站在sql角度,就无需在mysqldump或者诸如导出sql的方式来备份了. ...
- MySQL 对比数据库表结构
200 ? "200px" : this.width)!important;} --> 介绍 本章主要介绍怎样对比数据库的表结构的差异,这里主要介绍使用mysqldiff工具 ...
- 读数据库所有表和表结构的sql语句
SQL获取所有数据库名.表名.储存过程以及参数列表 1.获取所有用户名:SELECT name FROM Sysusers where status='2' and islogin='1'islogi ...
- 创建表结构的sql语句
1.创建表结构 表名: ODS_PSP_DIS_DAY_CALC create table ODS_PSP_DIS_DAY_CALC ( ID CHAR(32) NOT NULL, DIS ...
- 数据库中清空数据,保留表结构的sql语句
方法一:Delete Form 表名 方法二:TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 D ...
- mysql中查看表结构的sql语句
mysql查看表结构命令,如下: desc 表名;show columns from 表名;describe 表名;show create table 表名; use information_sche ...
随机推荐
- QT 中Widgets-Scene3d例子学习
QT中自带的例子widgets-scene3d实现在基于Widget的应用程序中使用qml 3d场景的功能,我在此基础上,将basicshapes-cpp的例子加以嵌入: 相关代码如下: C++ C ...
- linux环境下,对于一个大文件,如何查看其中某行的内容
需求说明: 今天在做mysql数据导入的过程中,导入到最后有一个报错,报某张表不存在.然后就想看看这行到底是在做什么操作的时候报的错误. 报错信息: [mysql@host---- ~]$ cat n ...
- android评分条RatingBar自定义设置
RatingBar为评分条控件,默认效果为若干个绿色的星星,如果想将其换成其他自定义图片就要自定义它的style.首先是布局文件: 其中android:numStars="5"设置 ...
- 设计模式-行为型模式,python备忘录模式
备忘录模式 备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象.备忘录模式属于行为型模式. 介绍 意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该 ...
- 18职责链模式CoR
一.什么是职责链模式 Chain of Responsibility(CoR)模式也叫职 责链模式或者职责连锁模式,是行为模式之一, 该模式构造一系列分别担当不同的职责的类的对 象来共同完成一个任务, ...
- easyGUI 用法介绍
Python 模块EasyGui详细介绍 EasyGui 官网: -http://easygui.sourceforge.net 官方的教学文档: -easygui-docs-0.96\tutoria ...
- linux下git怎么保存账号密码
我是用 shell 命令来执行 git 操作的,所以就决定在 --global 配置一下用户名和密码,不用每次手动输入了. 设置步骤 1. 首先需要 ftp 连接到你的 Linux 服务器,在根目录( ...
- 剖析Elasticsearch集群系列之二:分布式的三个C、translog和Lucene段
转载:http://www.infoq.com/cn/articles/anatomy-of-an-elasticsearch-cluster-part02 共识——裂脑问题及法定票数的重要性 共识是 ...
- hashlib
登录认证 加密 --> 解密 摘要算法 两个字符串 : import hashlib # 提供摘要算法的模块 md5 = hashlib.md5() md5.update(b') print(m ...
- favicon.ico 网站小图标标识
随便打开一个网页:比如 http://www.baidu.com/ 可以看到在浏览器的标签头上面显示了一个图标,这个图标是:,也就是我们常说的favicon.ico. 由于这篇文章主要讨论favico ...