mysql 迁移 sql server 的经理,首先开发,迁移工具我用到了,ssma , kettle,navicat 12,首先表结构可以用ssma mysql for sql server直接转换,然后你负责sql 到sql server上直接创建表就可以了,也可以直接用ssma工具直接转换,至于ssma怎么用,就去自行百度吧,我也几句话说不清楚,然后表里面的数据可以用kettle,做导入,kettle 的spoon是个很好用的图形化界面,直接用就可以了,不会的话可以去百度都有使用教程,最后就是数据库里面的存储过程,函数,和事件的转移的,这些的话可以用ssma工具做初步转换,但是还是有很多都需要自己来修改的,总结三个方面吧:1.首先业务逻辑需要你自己核对,2.数据库的结构需要修改也需要自己修改,3.语法不支持,需要自己找到对应的语法,这里我遇到一个很坑的地方,就是mysql中的预编译sql 和 sql server 里面的语法是不一样的,mysql里面用的是这样的:
set @sqlcode=concat('CREATE TABLE IF NOT EXISTS ',v_archivetablename,' like ',v_tableschema,'.',v_tablename,'');
PREPARE v_sqlcode from @sqlcode;
EXECUTE v_sqlcode;
DEALLOCATE PREPARE v_sqlcode;
但是SQL server里面需要这样写,和有两种动态执行方式 :、
SET @sqlcode = (N' if not exists ' )
+(N'(select * from sysobjects where name = ''')
+(@v_archivetablename)
+(N''')')
+(N' select * into ')
+(@v_archivetablename)
+(N' from ')
+ (@v_tableschema)+ (N'.') + (@v_tablename)
+(N' where 1=0 ')
EXEC sp_executesql @sqlcode~
SET @sqlcode =
(N'insert into hgs_if_m_dsn_archive(pmfcode,wono,partno,sn,linecode,shiftcode,stagecode,ispass,'+NCHAR(13)+NCHAR(10)+NCHAR(9)+N'isfail,productiondate,scanby,scandt,actual,target,isabnormal,processcode,filename,editdt)'+NCHAR(13)+NCHAR(10))
+(N'select top ')
+(@v_batchsize)
+(N' pmfcode,wono,partno,sn,linecode,shiftcode,stagecode,
ispass,isfail,productiondate,scanby,scandt,actual,target,'+NCHAR(13)+NCHAR(10)+NCHAR(9)+NCHAR(9)+NCHAR(9)+N'isabnormal,processcode,filename,editdt from ')
+ (@v_tableschema)+ (N'.') + (@v_tablename) +
(N' where CONVERT(VARCHAR(10),editdt,120) <= ') +
(N'CONVERT(varchar(10),DATEADD(DAY,-')+(@v_daycount)+(N',''')+(@thisday)+
(N'''),120)')+ (N' ')
EXEC (@sqlcode)
总结以下几点:
一.使用exce sp_executesql效率比exec要高,同一类型的语句,只需编译一次即可,而exec执行几次就需要编译几次。
二.构造动态sql的where子句,也就是条件子句时,exec无法使用变量来进行站位,需要将变量转换成字符串,然后和动态sql进行拼接,这就可能引起Sql注入问题,如下:
SET @sql = 'SELECT * FROM '+QUOTENAME(@TableName) +
' WHERE OrderID = '+CAST(@OrderID AS VARCHAR(50)) + ' ORDER BY ORDERID DESC'
三
而若使用exec sp_executesql则可以使用变量来进行站位,以后再给这个参数传值的放式构造动态sql,就避免的Sql注入的问题,如下:
SET @sql = 'SELECT * FROM '+@TableName + ' WHERE OrderID = @OID ORDER BY ORDERID DESC'
然后对应 limit 对应 top 这些 很多需要修改的地方,都是在百度的大佬那找到对应的,反正花了很多时间终于把数据库给迁移过去了,感觉市面上没有很完美的数据库迁移工具,都需要人为的修改一些东西。