您的位置:首页 > 数据库 > MySQL

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

2011-09-16 18:48 344 查看
这次面临服务器对不同操作系统迁移,我全力支持迁移工作。

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

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

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

SQLSERVERMYSQL
set ANSI_NULLS ON
set 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 DATETIME
IN 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 condition
BEGIN
...
END
ELSE IF condition
BEGIN
...
END
ELSE
BEGIN
...
END
IF (condition)
THEN
...

ELSEIF (condition) #不能有空格
THEN
...

ELSE
...
END IF;
@@ROWCOUNT
ROW_COUNT() #写
FOUND_ROWS() #读
datediff
#参数不一样,且需要转成时间串。
#具体google一下datediff sqlserver和datediff mysql
datediff
delete `XXX`
TRUNCATE TABLE `XXX`;
#为了删除数据,不完全等效,用TRUNCATE重置了整个表,比如自增量
DBCC CHECKIDENT (`XXX`,reseed,1)
ALTER TABLE `XXX` AUTO_INCREMENT =1
ROW_FORMAT = COMPACT;
--#

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

还原"mysql --default-character-set=utf8 -uXXX -pXXX -f dbo < /data/dbo.sql" , 出现“Unknown character set: 'gbk'”类似的错误,说明缺字符集,或者你能保证数据是utf8,就搜一下sql文件注释(没错就在注释)里的gbk替换成utf8就行了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: