mysql迁移到SQLserver数据库迁移历程

本文详细介绍了如何将MySQL数据库迁移到SQL Server的过程,包括使用SSMA、Kettle和Navicat等工具进行表结构转换和数据迁移,以及处理存储过程、函数和事件的转换。迁移中需要注意业务逻辑核对、数据库结构修改和语法适应性调整,尤其是预编译SQL和动态执行方式的差异。总结了使用sp_executesql避免SQL注入问题和limit到top的替换策略等关键点。
摘要由CSDN通过智能技术生成

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 这些 很多需要修改的地方,都是在百度的大佬那找到对应的,反正花了很多时间终于把数据库给迁移过去了,感觉市面上没有很完美的数据库迁移工具,都需要人为的修改一些东西。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蛋蛋淡淡定

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值