乘势一代的迈入,社会的迈入,各类本领千千万万形形色色理伙不清数不完(写作文吗!!!卡塔尔

不扯废话,轻易来讲,超级多商店都会同期使用各个数据库,因而数据在区别数据库之间导入导出就产生叁个令人蛋疼的难点,对于周期行的必要,能够付出特地的程序管理,不过对于突发性不分明的供给,就到了亟待DBA投身的时候呀,当供给将MySQL数据导入到SQL
Server中时,该怎么搞呢?

道理当然是那样的使用工具最轻便易行,不过本人就大要工具!!!

在MySQL中创设测量检验数据:

create table tb001(c1 int auto_increment primary key,c2 varchar(2000));
insert into tb001(c2) select 'abc\r\n';
insert into tb001(c2) select '你好啊\r\n';
insert into tb001(c2) select '你好啊\n';
insert into tb001(c2) select '双引号"';
insert into tb001(c2) select '全角双引号“';
insert into tb001(c2) select '单引号''';
insert into tb001(c2) select '全角单引号’';

##=====================================================================##
动用mysqldump来导出与MS SQL SEGL450VE瑞虎宽容的INSERT 语句:

mysqldump --host='192.168.166.169' --port=3358 --user='mysql_admin' --password='mysql@Admin@Pwd' --skip-add-locks --compatible=mssql --complete-insert --compact --extended-insert=false --default-character-set=utf8 -t --databases 'test' --table 'tb001' >/tmp/t4.sql

地点脚本的有个别注解表达:

–compatible=mssql ##导出的SQL与MS SQL Server兼容
–complete-insert ##导出的INSERT语句包含列名
–compact ##行使轻巧形式,不出口各个MySQL音讯
–extended-insert=false ##使用意气风发行数据一条INSERT的方法
–default-character-set=utf8 ##钦定导出的字符集
-t ##-t代表只导出多少,-d表示只导出数据结构
–databases ‘test’ ##数据库名称
–table ‘CityMatchup’ ##表名

导出结果为:

INSERT INTO "tb001" ("c1", "c2") VALUES (1,'abc\r\n');
INSERT INTO "tb001" ("c1", "c2") VALUES (2,'你好啊\r\n');
INSERT INTO "tb001" ("c1", "c2") VALUES (3,'你好啊\n');
INSERT INTO "tb001" ("c1", "c2") VALUES (4,'双引号\"');
INSERT INTO "tb001" ("c1", "c2") VALUES (5,'全角双引号“');
INSERT INTO "tb001" ("c1", "c2") VALUES (6,'单引号\'');
INSERT INTO "tb001" ("c1", "c2") VALUES (7,'全角单引号’');

对此列名用双引号的标题,能够运用SET QUOTED_IDENTIFIERAV4 ON
来管理,也得以选取SQLCMD加-I参数来拍卖
可是对文件中的单引号就无解了,MySQL中选用”\”来作为转义符,而SQL
Server中动用八个单引号来表示三个单引号。

MySQLdump能够将数据导成INSERT语句,并提供配置宽容别的数据库的参数,但出于差别数据库转义字符差别,由此尽管选用compatible=mssql也无法保险导出的脚本能在SQL
Server中平常试行。

##===========================================================================##

应用SELECT INTO OUTFILE来导出多少

SELECT * INTO OUTFILE '/tmp/tb001.txt' 
FIELDS TERMINATED BY '||--||' 
LINES TERMINATED BY '||==||' FROM test.tb001;

在Linux下观察的是这样:

图片 1

尽管有一点乱,不过忍啦!

下一场下载文件,使用notepad++展开,接收“格式”>> “转为ANSI编码格式”
,然后另存为新文件,在SQL Server中运用BULK INSERT来导入:

CREATE TABLE tmp_tb001(id NVARCHAR(2000),c1 NVARCHAR(2000))
GO
BULK INSERT tmp_tb001
FROM 'D:\tb002.txt'
WITH(FIELDTERMINATOR='||--||',
ROWTERMINATOR='||==||'
)
GO
SELECT * FROM tmp_tb001

也尚可SQL Server的导入导出工具来拍卖,重要校订分隔符。

小心接纳SELECT INTO OUTFILE导出文件时,NULL值被代表为\N,而\N在导入SQL
Server时会被当下字符串“\N”来处理,因而提议先创造一个完全由NVARCHA奥德赛类型列组成的表来“暂存”导入的时候,然后经过数据清理后再导入正式表中,对于懒与一列一列折腾的人的话,能够拼下SQL来博取表的持有列转变:

SELECT 
'CASE WHEN ['+T1.name+']=''\N'' THEN NULL ELSE ['+T1.name+'] END AS ['+T1.name+'],'
FROM sys.all_columns T1
WHERE T1.object_id=OBJECT_ID('tmp_tb001')

出于大家强行将\N当成NULL来转变,难免会变成加害,将真正数据就为’\N‘的值变为NULL,由此导完数据后检查是必得的。

终极语句为:

SELECT 
CASE WHEN [id]='\N' THEN NULL ELSE [id] END AS [id],
CASE WHEN [c1]='\N' THEN NULL ELSE [c1] END AS [c1]
FROM tmp_tb001

推行结果为:

图片 2

##=======================================================================##

导出INSERT脚本存在转义字符单引号的标题,同一时间导出数据不含有GO,在须求大批量数额导入到SQL
SEOdysseyVE昂科威时存在严重的质量难题,能够品尝参照他事他说加以考察自己的《Powershell–批量拆分SQL语句为业务并批管理》来拍卖,但也是主题材料多多。

而导出文件然后导入的议程,须要对文本进行一遍调换,文件非常大时notepad++大概不能打卡,UE能微微给力点,但面前遭逢有些个G的文本文件也是回天乏术,同一时间NULL值管理也亟需严慎对待。

##========================================================================##

好啊,是时候上妹子啊。

图片 3