SQL SERVER 到 MYSQL 迁移存储过程代码改写详细对照表

来源:互联网 发布:古玩农村收藏淘宝网 编辑:程序博客网 时间:2024/04/28 17:29

这次面临服务器对不同操作系统迁移,我全力支持迁移工作。

一直做c++游戏服务端,对类似规模迁移全然没实战经验,踏错一步就是万丈深渊。程序代码的迁移比较有信心,数据库感觉有点烦银。经过一两周折腾,小心翼翼把“数据库全功能”成功导入了mysql(5.1.40),并且把程序底层调用接口相应改好。测试顺利通过,长呼一口气擦擦汗吧。这次迁移最头疼的存储过程的批量迁移,收集资料总结两个数据库的存储过程语法的差异,反复修改迁移脚本,终于成功了。

转结构、数据都可以用工具比较完美的迁移,没有找到工具可以完美转移存储过程,由于存储过程量较大,所以选择手动写脚本工具!可是并不顺利,不兼容的语法把写工具的工作变得复杂。

这次回忆下碰到比较多的不兼容语法,基本找到等效的替代办法,记性不好写出来方便以后查看

SQLSERVERMYSQL

set ANSI_NULLS ONset QUOTED_IDENTIFIER ON
#可以无视                                                             
GO
#可以无视
 句末加分号
ALTER PROCEDURE [dbo].[XXX]
CREATE PROCEDURE `XX`.`XXX`
@A INT,@B INT OUTPUT,@C VARCHAR(255),@D DATETIME,@E DECIMAL(8,2),@F BIT,@G FLOAT,...
IN A INT,OUT B INT,IN C VARCHAR(255)/*OR TEXT*/,IN D DATETIMEIN E DECIMAL(8,2),IN F BOOL,IN G FLOAT,...
放到as以后
declare _date TYPE
放到begin以后
declare _date TYPE;
RETURN X
#有的情况可以直接输出。
#最好加一个out X做返回值,不过程序那边得改动底层接口
RETURN ;
ABC:BEGIN...    LEAVE ABC;...END
SELECT @X = A FROM XXX WHERE B = NULL
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";SELECT A FROM XXX WHERE B = NULL INTO @X;
IF conditionBEGIN...ENDELSE IF conditionBEGIN...ENDELSEBEGIN...END
IF (condition)THEN...ELSEIF (condition) #不能有空格THEN...ELSE...END IF;
@@ROWCOUNT
ROW_COUNT() #写FOUND_ROWS() #读
datediff
#参数不一样,且需要转成时间串。#具体google一下datediff sqlserver和datediff mysqldatediff
delete `XXX`
TRUNCATE TABLE `XXX`;
#为了删除数据,不完全等效,用TRUNCATE重置了整个表,比如自增量
DBCC CHECKIDENT (`XXX`,reseed,1)
ALTER TABLE `XXX` AUTO_INCREMENT =1 ROW_FORMAT = COMPACT;
--#
--......  #这里不是省略


弄好后“mysqldump -uXXX -pXXX  -R -d  -x --default-character-set=utf8 --opt --extended-insert=false --skip-triggers dbo > /data/dbo.sql”备份一下,不带数据的,带数据去掉“-d”


还原"mysql  -uXXX -pXXX -f  --default-character-set=utf8 dbo < /data/dbo.sql" , 出现“Unknown character set: 'gbk'”类似的错误,说明缺字符集,或者你能保证数据是utf8,就搜一下sql文件注释(没错就在注释)里的gbk替换成utf8就行了

原创粉丝点击