概要:

mssql向mysql迁移的实例,所要用到的工具bcpload data local infile

由于订单记录的数据是存放在mssql服务器上的,而项目需求把数据迁移到mysql server,存在的问题mssql和mysql订单表结构不同,所以不能直接导入到mysql中的订单表里面。

解决思路,首先,在mysql数据库新建一张与mssql中订单表结构一样的表,在mssql上利用bcp工具导出数据为csv,然后把导出csv数据上传到mysql服务器上用load data命令行导入表;最后通过存储过程查询循环insert到目标表中。

导出表结构并且修改后,在mysql服务器上创建同样结构的表:(以下图为:mssql导出表结构图)

以下是导出csv相关sql语句

 use data_trade;
Go SP_CONFIGURE'show advanced options',1
RECONFIGURE
Go
SP_CONFIGURE 'xp_cmdshell',1
RECONFIGURE
Go EXEC master..xp_cmdshell 'BCP data_trade.do.t_trade OUT D:\trade.csv -c -t "jxfield" -T -r "jxrowend"'

由于订单表中的字段比较复杂,字段中包含了逗号,换行和回车等符号,所以从定义的了字段分隔符和行的终止符,分别用 -t -r两个参数定义。

去掉字段中的空号逗号换行符和回车;

$ cat a.csv |  tr -d ' ,^' | sed 's/jxrowend/$^/g' | tr '^' '\n' >b.csv

将导出的csv文件上传到mysql服务器上的/tmp目录下并c,然后执行

load data local infile '/tmp/trade.csv'
into table `t_trade`
character set gbk
fields terminated by 'jxfield'
optionally enclosed by '"'
escaped by '"'
lines terminated by 'jxrowend';

查询循环插入到目标表中代码如下:

 DELIMITER ;;

 DROP PROCEDURE IF EXISTS `update_trade`;;
CREATE PROCEDURE `update_trade` ()
BEGIN
-- 需要定义接收游标数据的变量
DECLARE astorage_id varchar(40);
DECLARE atid varchar(40);
DECLARE apro_detail_code varchar(40);
DECLARE apro_name varchar(255);
DECLARE aspecification varchar(255);
DECLARE abarcode varchar(40);
DECLARE acombine_barcode varchar(40);
DECLARE aiscancel varchar(40);
DECLARE aisscheduled varchar(40);
DECLARE astock_situation varchar(40);
DECLARE aisbook_pro varchar(40);
DECLARE aiscombination varchar(40);
DECLARE aisgifts varchar(40);
DECLARE agift_num int(20);
DECLARE abook_storage varchar(40);
DECLARE apro_num varchar(40);
DECLARE asend_num varchar(40);
DECLARE arefund_num varchar(40);
DECLARE arefund_renum varchar(40);
DECLARE ainspection_num varchar(40);
DECLARE atimeinventory varchar(40);
DECLARE acost_price decimal(20,2);
DECLARE asell_price decimal(20,2);
DECLARE aaverage_price decimal(20,2);
DECLARE aoriginal_price decimal(20,2);
DECLARE asys_price decimal(20,2);
DECLARE aferght decimal(20,2);
DECLARE aitem_discountfee decimal(20,2);
DECLARE ainspection_time varchar(40);
DECLARE aweight varchar(40);
DECLARE ashopid varchar(40);
DECLARE aout_tid varchar(40);
DECLARE aout_proid varchar(40);
DECLARE aout_prosku varchar(40);
DECLARE aproexplain varchar(40);
DECLARE abuyer_memo varchar(40);
DECLARE aseller_remark varchar(255);
DECLARE adistributer varchar(40);
DECLARE adistribut_time varchar(40);
DECLARE asecond_barcode varchar(40);
DECLARE aproduct_no varchar(40);
DECLARE abrand_number varchar(40);
DECLARE abrand_name varchar(40);
DECLARE abook_inventory int(40);
DECLARE aproduct_specification varchar(255);
DECLARE adiscount_amount decimal(20,2);
DECLARE acredit_amount decimal(20,2);
DECLARE aMD5_encryption varchar(40); -- 遍历数据结束标志
DECLARE done INT DEFAULT FALSE;
-- 游标
DECLARE cur CURSOR FOR SELECT `AC0018`,`TC0013`,`EC0155`,`EC0123`,`ac2037`,`TC0087`,`AI0033`,`EI0734`,`AI0021`,`AM0024`,`TM0030`,`AM0100`,`EQ0147`,`AD0001`,`TC0108`,`EC0155`,`AI0032` FROM `edb_item` order by `AQ2520` asc where `AQ2520`<'2014-04-09 11:31:24' order by `AQ2520` asc; -- 将结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- 打开游标
OPEN cur; -- 开始循环
read_loop: LOOP
-- 提取游标里的数据,这里只有一个,多个的话也一样;
FETCH cur INTO atid,apro_detail_code,apro_name,aspecification,abarcode,astock_situation,agift_num,apro_num,arefund_renum,asell_price,aoriginal_price,aitem_discountfee,ainspection_time,aweight,aout_tid,aproexplain,ainspection_num;
-- 声明结束的时候
IF done THEN
LEAVE read_loop;
END IF;
-- 这里做你想做的循环的事件
-- IF ainspection_num is null THEN SET ainspection_num=0;END IF;
SET astorage_id=null;
SET acombine_barcode=null;
SET aiscancel=null;
SET aisscheduled=null;
SET aisbook_pro=null;
SET aiscombination=null;
SET aisgifts=null;
SET abook_storage=null;
SET asend_num=null;
SET arefund_num=null;
SET atimeinventory=null;
SET acost_price=null;
SET aaverage_price=null;
SET asys_price=null;
SET aferght=null;
SET ashopid=null;
SET aout_proid=null;
SET aout_prosku=null;
SET abuyer_memo=null;
SET aseller_remark=null;
SET adistributer=null;
SET adistribut_time=null;
SET asecond_barcode=null;
SET aproduct_no=apro_detail_code;
SET abrand_number=null;
SET abrand_name=null;
SET abook_inventory=null;
SET aproduct_specification=null;
SET adiscount_amount=null;
SET acredit_amount=null;
SET aMD5_encryption=null; insert into `t_trade_array`(storage_id,tid,pro_detail_code,pro_name,specification,barcode,combine_barcode,iscancel,isscheduled,stock_situation,isbook_pro,iscombination,isgifts,gift_num,book_storage,pro_num,send_num,refund_num,refund_renum,inspection_num,timeinventory,cost_price,sell_price,average_price,original_price,sys_price,ferght,item_discountfee,inspection_time,weight,shopid,out_tid,out_proid,out_prosku,proexplain,buyer_memo,seller_remark,distributer,distribut_time,second_barcode,product_no,brand_number,brand_name,book_inventory,product_specification,discount_amount,credit_amount,MD5_encryption) values (astorage_id,atid,apro_detail_code,apro_name,aspecification,abarcode,acombine_barcode,aiscancel,aisscheduled,astock_situation,aisbook_pro,aiscombination,aisgifts,agift_num,abook_storage,apro_num,asend_num,arefund_num,arefund_renum,ainspection_num,atimeinventory,acost_price,asell_price,aaverage_price,aoriginal_price,asys_price,aferght,aitem_discountfee,ainspection_time,aweight,ashopid,aout_tid,aout_proid,aout_prosku,aproexplain,abuyer_memo,aseller_remark,adistributer,adistribut_time,asecond_barcode,aproduct_no,abrand_number,abrand_name,abook_inventory,aproduct_specification,adiscount_amount,acredit_amount,aMD5_encryption); END LOOP;
-- 关闭游标
CLOSE cur; END;;
DELIMITER ;

若在存储过程出现错误,相关处理可以参考continue handler;

相关参考博文:

dcp使用心得:http://www.cnblogs.com/puke/archive/2013/06/05/3119378.html

mysql错误处理 :http://blog.chinaunix.net/uid-20304312-id-1707822.html

mssql与mysql 数据迁移的更多相关文章

  1. MySQL数据迁移那些事儿

    前言: 在平时工作中,经常会遇到数据迁移的需求,比如要迁移某个表.某个库或某个实例.根据不同的需求可能要采取不同的迁移方案,数据迁移过程中也可能会遇到各种大小问题.本篇文章,我们一起来看下 MySQL ...

  2. MySQL数据迁移到MSSQL-以小米数据库为例-测试828W最快可达到2分11秒

    这里采用.NET Framework 4.0以上版本中新出现的 ConcurrentQueue<T> 类 MSDN是这样描述的: ConcurrentQueue<T> 类是一个 ...

  3. MySQL数据迁移到SQL Server

    数据迁移的工具有很多,基本SSMA团队已经考虑到其他数据库到SQL Server迁移的需求了,所以已经开发了相关的迁移工具来支持. 此博客主要介绍MySQL到SQL Server数据迁移的工具:SQL ...

  4. mysql 数据迁移

    最近线上系统新挂了一次磁盘,需要将系统磁盘下的 mysql 数据目录迁移到 数据盘上. 经过一番考察,mysql在安装时,使用了预编译的二进制tar.gz包.共有两处配置了 datadir属性 /et ...

  5. centos下mysql数据迁移方法

    第一种: 原始数据库不需要重新安装: 默认mysql会安装在/var/lib/mysql这里,若将数据迁移到/data/mysql目录下,步骤如下: 1.停止mysql服务 2.#cp /var/li ...

  6. MySQL数据迁移问题

    最近尝试了一下小型数据迁移.本地迁移,windows平台,修改配置文件中的data_dir项,然后将旧的data文件下的数据文件全部拷贝过去. 之后登陆数据库,竟然1145错误.可以看到数据库的结构, ...

  7. Mysql 数据迁移后 启动出错

    今天上班后不知道为什么,mysql一直无法启动,折腾了半天于是决定重装 我本地的server用的是wamp , 重装的时候, 要进行数据备份 , 我使用的最简单粗暴的备份方式, 就是直接进入到mysq ...

  8. .Net5 IdentityServer4下SqlServer和Mysql数据迁移

    1.概念 以下概念从官网整理的,我也是看官网一步一步学习的 官网地址 https://identityserver4.readthedocs.io/en/latest/index.html 1.1 I ...

  9. 记一次MySQL数据迁移到SQLServer全过程

    为什么要做迁移? 由于系统版本.数据库的升级,导致测试流程阻塞,为了保证数据及系统版本的一致性,我又迫切需要想用这套环境做性能测试,所以和领导.开发请示,得到批准后,便有了这次学习的机会,所以特此来记 ...

随机推荐

  1. python调用其他程序或脚本方法(转)

    python运行(调用)其他程序或脚本 在Python中可以方便地使用os模块运行其他的脚本或者程序,这样就可以在脚本中直接使用其他脚本,或者程序提供的功能,而不必再次编写实现该功能的代码.为了更好地 ...

  2. 关于JS事件的几点总结

    1.理解事件(2点) 事件行为本身:没有给事件绑定方法事件也是一直存在的,当触发行为的时候,也对触发对应的行为,只不过由于没有绑定事件,导致没有任何事件发生: 事件绑定:给元素绑定一个方法:触发行为, ...

  3. java中面向对象的一些知识(一)

    一:基本概念 举例:写一个程序,实现如下功能: 一群宠物,宠物有各种类型,如猫.狗.企鹅等 让这群宠物,按照各自的能力不同,进行各种比赛(如爬树.游泳.跳水):扩展性需求: 游泳比赛游泳池的参数.飞盘 ...

  4. java文件下载和导出文件名乱码浏览器兼容性问题

    实例: String poorName= dataMap.get("NAME").toString(); String villageName = dataMap.get(&quo ...

  5. HTML5 的一些小的整理吧

    主要的就是一些HTML 5 API 的使用 也是借鉴别人的博客 ,和MDN(中文部分的还是能看的懂) 上面的一些东西 具体的代码在 有道云笔记里面也有. 先把总得列出来 1.Canvas绘图 学完这个 ...

  6. 总结一下项目中遇到的分页问题,使用bootstrap-table来做的后台分页,大家可以借鉴一下 (分页第一篇)

    前台进入bootstrap的js和css文件,我就不多少了,另外要引进bootstrap-table的js和css 废话不多说,直接代码.   框架为ssm,代码很清楚 <div class=& ...

  7. iOS-上架APP之启动页设置(新手必看!)

    今天自己做的小作品准备提交,就差一个启动页,各种百度,各种搜,结果还好最后终于出来了,和大家分享一下,这个过程中遇到的各种小问题.(注XCode版本为7.2) 1.启动页一般都是图片,因为苹果有4,4 ...

  8. CSS 布局

    近日开发中,总感觉页面布局方面力不从心.以前也曾学过这方面的内容,但是不够系统,因此我打算整理一下. 在web 页面中一般有 table 和 css+div 两种布局方式. 其中css+div 又分为 ...

  9. 一.Timesten安装

    一,安装timesten IMDB并测试 1. 创建数据库相关用户和组 groupadd timesten useradd -g timesten -G dba timesten passwd tim ...

  10. 联想笔记本如何开启笔记本的VT-x虚拟化技术功能

    虚拟化技术支持,需几个方面的条件支持:芯片组自身支持.BIOS提供支持.处理器自身支持.操作系统支持. 操作系统方面,主流操作系统均支持VMM管理,因此无需考虑. 而芯片组方面,从Intel 945( ...