sqlserver tablediff 实用工具
tablediff 是sqlserver自带的实用工具
sqlserver 2012 在110目录下,sqlserver2008在100目录下
官方参考文档如下:
https://docs.microsoft.com/en-us/sql/tools/tablediff-utility?view=sql-server-2017
既可以做一定级别的数据kpi验证,也可以用于 对比 测试环境和生产环境的 数据库表数据差异,并生成收敛差异的批量sql。
具体功能可以参考上述官方文档。
下面实测具体用途。
数据收敛首先要明确数据应该是什么样的,比如我测试环境需要同步生产环境数据,那么我需要收敛的是测试环境缺失的数据。
在这种情况下,我们需要把 源端定义为生产环境数据库,目标端定义为测试环境数据库。
源端数据库执行:
- tablediff -sourceserver "生产环境数据库IP地址" -sourcedatabase "生产环境数据库" -sourceschema "生产环境架构名称"
- -sourcetable "生产环境表" -sourceuser "生产环境登录名称"
- -sourcepassword "生产环境密码" -destinationserver "测试环境数据库ip地址"
- -destinationdatabase "测试环境数据库名称" -destinationschema "测试环境架构名称"
- -destinationtable "测试环境的mapping表" -destinationuser "测试环境登录名" -destinationpassword "测试环境数据库用户密码"
-f "d:\tools\V_SYS_MESSAGES_Diff.sql"
这样就生成了收敛的sql,具体语句为insert。
坑1: tablediff 工具通过比较行内容进行收敛,是存在一定问题的,比如 “NULL” 值 是不能进行比较的,大对象字段很难比较,这需要将表进行视图转换:
过滤掉null,xtype等特殊字段。当然,表中没有这些字段或者无null更好。
源端执行:
- declare @table_name nvarchar(100)
- set @table_name='SYS_MESSAGES'
- if exists (select 1 from sys.tables where name=@table_name)
- begin
- declare @table_info table
- (id int identity(1,1) not null,info nvarchar(300))
- insert into @table_info
- select 'create view V_'+@table_name+'_Diff'
- insert into @table_info
- select 'as'
- insert into @table_info
- select 'select '
- insert into @table_info
- select case when isnullable=0 then tablename+','
- else tablename+','+default_value+') as '+name+',' end
- from (
- select a.isnullable,a.name,b.xtype,
- case when a.isnullable =0 then ' ['+a.name+']' else ' ISNULL('+a.name end as tablename,
- case when b.xtype in (48,52,56,127) then '-100' --tinyint\smallint\int\bigint
- when b.xtype in (59,60,62,106,108) then '1.01'--real\money\float\decimal\numeric
- when b.xtype=40 then '''1900-01-01''' --date
- when b.xtype=41 then '''01:00:01''' --time
- when b.xtype=58 then '''1900-01-01 01:01:01''' --smalldatetime
- when b.xtype=61 then '''1900-01-01 01:01:01.001''' --datetime
- else '''@#''' end as default_value
- from syscolumns a,systypes b
- where a.id = OBJECT_ID(@table_name) and a.xtype = b.xusertype
- )a where xtype not in(34,35,99,165,173,189,241)--xml\timestamp\binary\varbinary\ntext\text\image
- update @table_info set info=SUBSTRING(info,1,len(info)-1) where id=
- (select MAX(id) from @table_info)
- insert into @table_info values('from dbo.['+@table_name+'] with(nolock)')
- select info from @table_info
- end
- else
- print('Can not find the table '+@table_name)
生成视图的sql
- create view V_SYS_MESSAGES_Diff
- as
- select
- [MSG_ID],
- ISNULL(MSG_TIME,'@#') as MSG_TIME,
- ISNULL(MSG_TYPE,'@#') as MSG_TYPE,
- ISNULL(MSG_CONTENT,'@#') as MSG_CONTENT,
- ISNULL(MSG_USER,'@#') as MSG_USER,
- ISNULL(MSG_MARK1,'@#') as MSG_MARK1,
- ISNULL(MSG_MARK2,'@#') as MSG_MARK2,
- ISNULL(MSG_MARK3,'@#') as MSG_MARK3,
- ISNULL(PROCESS_FLAG,-100) as PROCESS_FLAG
- from dbo.[SYS_MESSAGES] with(nolock)
目标端也重复上述操作。然后再利用tablediff工具进行对比收敛。
sqlserver tablediff 实用工具的更多相关文章
- Sqlserver tablediff的简单使用
1. 先列举一下自己简单的比较语句 tablediff -sourceserver 10.24.160.73 -sourcedatabase cwbasemi70 -sourceschema lcmi ...
- SqlServer中sqlmaint 实用工具和xp_sqlmaint扩展过程
sqlmaint 实用工具可以对一个或多个数据库执行一组指定的维护操作.使用 sqlmaint,可以运行 DBCC 检查.备份数据库及其事务日志.更新统计以及重建索引.所有数据库维护活动都会生成报表, ...
- Bootstrap<基础十> 响应式实用工具
Bootstrap 提供了一些辅助类,以便更快地实现对移动设备友好的开发.这些可以通过媒体查询结合大型.小型和中型设备,实现内容对设备的显示和隐藏. 需要谨慎使用这些工具,避免在同一个站点创建完全不同 ...
- 10款让WEB前端开发人员更轻松的实用工具
这篇文章介绍10款让Web前端开发人员生活更轻松的实用工具.每个Web开发人员都有自己的工具箱,这样工作中碰到的每个问题都有一个好的解决方案供选择. 对于每一项工作,开发人员需要特定的辅助工具,所以如 ...
- 十款让 Web 前端开发人员更轻松的实用工具
这篇文章介绍十款让 Web 前端开发人员生活更轻松的实用工具.每个 Web 开发人员都有自己的工具箱,这样工作中碰到的每个问题都有一个好的解决方案供选择. 对于每一项工作,开发人员需要特定的辅助工具, ...
- .Net 高效开发之不可错过的实用工具(转)
.Net 高效开发之不可错过的实用工具(转) 本文摘自: http://www.cnblogs.com/powertoolsteam/p/5240908.html#3372237 Visual Stu ...
- 实用工具推荐(Live Writer)(2015年05月26日)
1.写博客的实用工具 推荐软件:Live Writer 使用步骤: 1.安装 Live Essential 2011,下载地址:http://explore.live.com/windows-live ...
- 快速访问WCF服务--ServiceModel 元数据实用工具 (Svcutil.exe)
基本定义 ServiceModel 元数据实用工具用于依据元数据文档生成服务模型代码,以及依据服务模型代码生成元数据文档. SvcUtil.exe ServiceModel 元数据实用工具可在 Win ...
- Mac开发者必备实用工具推荐
最近一个师兄给我推荐了一些Mac上的实用工具,用起来非常顺手,能提高不少开发效率.于是就想着把自己之前用过的其他工具也整理一下,一块推荐给大家,希望能对大家有帮助. Alfred 目前Mac下最好用的 ...
随机推荐
- JavaScript -- Enumerator
-----022-Enumerator.html----- <!DOCTYPE html> <html> <head> <meta http-equiv=&q ...
- js便签笔记(5)——Dean Edwards大牛的跨浏览器AddEvent()设计(不知道是不是jQuery事件系统的原型)
1. 前言: 在看Aaron的jquery源码解读时候,看到事件系统那块,作者提到了Dean Edwards的添加事件的设计,于是就点进去看了看.首先让我吃惊的是,代码非常少,寥寥几十行,非常简单.于 ...
- TensorFlow的梯度裁剪
在较深的网络,如多层CNN或者非常长的RNN,由于求导的链式法则,有可能会出现梯度消失(Gradient Vanishing)或梯度爆炸(Gradient Exploding )的问题. 原理 问题: ...
- js写的一个简单的手风琴菜单
1 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&q ...
- Android性能测试--垃圾回收频次统计的作用
频繁的垃圾回收有可能暗示着内存泄露,在我手机统计数据,每次垃圾回收会占据100ms左右,这对内存和事件响应要求严格的程序(游戏等)来讲是可观的性能损耗.
- vue-cli watch/timer
watch 监听函数 data:{ letter:'' }, watch:{ letter(){ xxxxxx } }, timer data(){ return{ timer:null } }, h ...
- 扒一扒HTTPS网站的内幕
215年6月,维基媒体基金会发布公告,旗下所有网站将默认开启HTTPS,这些网站中最为人所知的当然是全球最大的在线百科-维基百科.而更早时候的3月,百度已经发布公告,百度全站默认开启HTTPS.淘宝也 ...
- Spark2.1.0模型设计与基本架构(上)
随着近十年互联网的迅猛发展,越来越多的人融入了互联网——利用搜索引擎查询词条或问题:社交圈子从现实搬到了Facebook.Twitter.微信等社交平台上:女孩子们现在少了逛街,多了在各大电商平台上的 ...
- js类的继承
1.类式继承 首先要做的是创建构造函数.按惯例,其名称就是类名,首字母应该大写.在构造函数中,创建实例属性要用关键字this .类的方法则被添加到prototype对象中.要创建该类的实例,只需结合关 ...
- Vue Router的懒加载路径
单页应用产出的入口chunk大小随着业务的复杂度线性增加,导致后期加载速度越来越慢.后面就需要对不同路径下的模块进行拆分,打包到相应的chunk下,按需加载,找到chunk的大小.个数和页面加载速度的 ...