MS SQL Server2000转换成MySQL
按计划今天着手进行将后台数据库从MS SQL Server2000转换成MySQL5.1.3。目的是便于发布软件的测试版本。
1. 驱动: mysql-connector-odbc-5.1.11-win32.msi。测试Win7*64, XP通过, Win7*32、Win8的暂时没环境测试,待测。
2. MySQL_5.1.3免安装版。

3. MSS2SQL工具软件转换SQLServer2000的表结构。一共转换了43个表。
4. MSSQLServer2000到MySQL的存储过程的转换
(1)同表复制数据
#接触MySQL没几天,写的语句自己也觉得有些啰嗦,肯定可以优化,只能深入学习之后再进行了。
# To-Do. 2015年5月18日 10:14:51
DROP PROCEDURE IF EXISTS SP_UpdateData;
DELIMITER //
CREATE PROCEDURE SP_UpdateData (OLID VARCHAR(38), NLID VARCHAR(38), TableName VARCHAR(38))
BEGIN
SET @tablename=TableName;
SET @tmptablename=CONCAT(@tablename,'_tmp');
#删除临时表, 不加这句下次执行时会报错,提示临时表已存在
SET @sqlcmd=CONCAT('DROP TEMPORARY TABLE IF EXISTS ', @tmptablename);
PREPARE stmt FROM @sqlcmd;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
#创建临时表
SET @sqlcmd=CONCAT('CREATE TEMPORARY TABLE ', @tmptablename);
SET @sqlcmd=CONCAT(@sqlcmd, ' SELECT * FROM ');
SET @sqlcmd=CONCAT(CONCAT(@sqlcmd, @tablename), ' WHERE 1=0');
PREPARE stmt FROM @sqlcmd;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
#将来源数据插入临时表
SET @sqlcmd=CONCAT('INSERT INTO ', @tmptablename);
SET @sqlcmd=CONCAT(@sqlcmd, ' SELECT * FROM ');
SET @sqlcmd=CONCAT(@sqlcmd, @tablename);
SET @sqlcmd=CONCAT(@sqlcmd, ' WHERE LID=?');
SET @a=OLID;
PREPARE stmt FROM @sqlcmd;
EXECUTE stmt USING @a;
DEALLOCATE PREPARE stmt;
#刷新临时表的外键为NLID
SET @sqlcmd=CONCAT(CONCAT('UPDATE ', @tmptablename), ' SET MID=UUID(), LID=?');
SET @b=NLID;
PREPARE stmt FROM @sqlcmd;
EXECUTE stmt USING @b;
DEALLOCATE PREPARE stmt;
#临时表中数据插入回原表
SET @sqlcmd=CONCAT(CONCAT(CONCAT('INSERT INTO ', @tablename), ' SELECT * FROM '), @tmptablename);
PREPARE stmt FROM @sqlcmd;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END //
DELIMITER ;
(2)查询树形结构子节点
#遍历父节点ParentMID下的所有树节点, 开始时想参考SQL Server中的写法,利用临时表, 但是测试时报错,原因见8。
#因为对MySQL不熟悉,干脆直接新建了表,当临时表用, 实现功能先。
DROP PROCEDURE IF EXISTS SP_GetChildrenNodes;
DELIMITER //
CREATE PROCEDURE SP_GetChildrenNodes (ParentMID VARCHAR(50), Maker VARCHAR(20), IncludeRoot INT)
BEGIN
DELETE FROM A_tmp WHERE cMaker=Maker;
INSERT INTO A_Tmp (MID,cMaker) SELECT ParentMID, Maker;
WHILE EXISTS (SELECT MID FROM A WHERE PreMID IN (SELECT MID FROM A_tmp WHERE cMaker=Maker) AND MID NOT IN (SELECT MID FROM A_tmp WHERE cMaker=Maker)) DO
INSERT INTO A_tmp (MID,cMaker) SELECT MID,Maker FROM A WHERE PreMID IN (SELECT MID FROM A_tmp WHERE cMaker=Maker) AND MID NOT IN (SELECT MID FROM A_tmp WHERE cMaker=Maker);
END WHILE;
IF IncludeRoot = 1 THEN #查询结果包含父节点
SELECT * FROM A WHERE MID IN (SELECT MID FROM A_tmp WHERE cMaker=Maker) ORDER BY PreMID,iSerialNO;
ELSE
SELECT * FROM A WHERE MID IN (SELECT MID FROM A_tmp WHERE MID<>ParentMID AND cMaker=Maker) ORDER BY PreMID,iSerialNo;
END IF;
END; //
DELIMITER ;
5. SQL函数的区别
(1) select * from A where convert(nvarchar(10),tMakeDate,121)>='2015-05-08'
->SELECT * from A WHERE DATE_FORMAT(tMakeDate, '%Y-%m-%d')>='2015-05-08'
(2) select * from A where isnull(cMaker, '')<>''
-> SELECT * from A where IFNULL(cAuditMan,'')<>''
(3) select newid()
->SELECT UUID()
select getdate()
->SELECT NOW()
(4) update a set a.字段1=b.字段2 from 表A a, 表B b where a.MID='1'
->UPDATE 表A a, 表B b SET a.字段1=b.字段2 WHERE a.MID='1' AND b.MID='2'
(5) select top 10 * from A
-> SELECT * FROM A LIMIT 10
(6) select convert(nvarchar(10),getdate(),121) as Date1, convert(nvarchar(10),getdate()-2,121) as Date2
->SELECT DATE_FORMAT(NOW(),'%Y-%m-%d') as Date1, DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 2 DAY), '%Y-%m-%d') as Date2
(7) insert into A(MID,iType) select newid(), 1 where not exists(select 1 from A where iType=1)
->INSERT INTO A(MID, iType) SELECT UUID(), 1 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM A WHERE iType=1) #Dual虚拟表
(8)where (4
->WHERE(4
(9)添加字段 并指定编码格式
alter table A add cNewFldName varchar(20) CHARACTER SET utf8 DEFAULT null;
6. 设置MYSQL为UTF8编码
修改my.ini配置文件,参考:http://blog.csdn.net/red4711/article/details/6007248

(1)在 [mysqld]块中加上以下内容:
default-character-set = utf8
character_set_server = utf8
注意:如果此标签下已经存在“default-character-set=GBK”类似的内容,只需修改即可。
(2)在 [mysql]块中加上一行
default-character-set = utf8
(3)在 [mysql.server]块中加上一行
default-character-set = utf8
(4)在 [mysqld_safe]块中加上一行
default-character-set = utf8
(5)在 [client]块中加上一行
default-character-set = utf8
(6)重启MySql服务
修改My.ini后,重启MySQL服务,上截图中的latin1会调整为utf8, 如下图所示:

7. MYSQL中不支持匿名块,也就是说过程性语句IF,THEN必须放在存储过程中执行。
MS SQL Server中类似先判断 if exists (select 1 from A where MID='1') 再执行其它操作的语句在MySQL中要作调整。
8. MySQL中不允许在同一语句中对临时表多次引用
9. 存储过程中利用 exec 执行动态语句
SQL Server中能方便的将表名、字段名、(查询)条件等组合成SQL语句,利用exec、sp_executesql 执行动态语句,MySQL中区别不小:
MSSQLServer: //同一表中复制新增数据
set @mysql='select * into #temp from '+ @TableName+' where 1=0'
set @mysql=@mysql+' insert into #temp select * from '+@TableName+' where LID='''+@OLID+''''
set @mysql=@mysql+' update #temp set MID=newid() ,LID='''+@NLID+''''
set @mysql=@mysql+' insert into '+ @TableName+' select * from #temp '
exec(@mysql)
MySQL:
参考:http://blog.csdn.net/moshuchao/article/details/2153342
从MySQL 5.0 开始,支持了一个全新的SQL句法:
PREPARE stmt_name FROM preparable_stmt;
EXECUTE stmt_name [USING @var_name [, @var_name] ...];
{DEALLOCATE | DROP} PREPARE stmt_name;
(1)将表名作参数

测试时本想用下述思路:
a: SET @sqlcmd='select * from ?';
b: SET @tablename='test';
c: PREPARE stmt FROM @sqlcmd;
d: EXECUTE stmt USING @tablename;
e: DEALLOCATE PREPARE stmt;
在命令行中执行到c时,报错:
ERROR 1064(42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1
(2)将表名、查询字段、查询字段值 作为参数

实际存储过程见4.(1)同表复制数据。
10. MYSQL无法对字段设置类似MSSQLServer中newid()默认值。
代码中涉及操作数据库的地方已基本改完,接下来就要考虑数据库升级、备份、还原、数据文件安全等问题了,牵一发动全身,改点东西真是不容易……
2015年7月8日 09:48:33
11. 昨晚改了几个日期字段的类型timestamp改成datetime, 当时没注意,把允许空的选项给去掉了,今早来运行程序,报错,提示:
数据提供程序或其他服务返回 E_FAIL 状态。
重新将字段设置为允许空,问题解决。
MS SQL Server2000转换成MySQL的更多相关文章
- 怎么将oracle的sql文件转换成mysql的sql文件
怎么将sql文件导入PowerDesigner中的方法(将oracle的sql文件转换成mysql的sql文件)呢? 怎么将xx.sql文件的数据库结构导入powerdesigner 的方法呢? 现讲 ...
- 怎么将oracle的sql文件转换成mysql的sql文件-- 费元星
http://jingyan.baidu.com/article/ca41422fe01f251eaf99ed6e.html
- SQLServer数据库转换成MySQL数据库
由于工作需要,系统原先的SQLServer数据库要转换成MYSQL数据库,所以这两天就一直在查阅这方面的资料.最开始,我尝试从SQLServer中导出SQL文件,然后导入到MYSQL数据库中,发现报错 ...
- hibernate sql查询转换成VO返回list
hibernate sql查询转换成VO @Override public List<FenxiVo> getTuanDuiFenxiList(FenxiVo FenxiVo,Intege ...
- Mysql转换成SqlServer数据库,以及SqlServer转换成Mysql数据库
Windows XP sp2 MS SQL Server 2OOO sp1 MySql 5.0.41 1:MSSQLServer数据库导入到MySql数据库 步骤: 1.安装mysql数据库的ODBC ...
- 【HIVE】sql语句转换成mapreduce
1.hive是什么? 2.MapReduce框架实现SQL基本操作的原理是什么? 3.Hive怎样实现SQL的词法和语法解析? 连接:http://www.aboutyun.com/thread-20 ...
- MS SQL SERVER数据导入MySQL
1.sql server导出到xls,再导入到mysql中.亲测,单表数据量到百万以后,导出异常,可能由其它原因导致,没细纠.此种方式需要来回倒腾数据,稍繁琐. 2.采用kettle第三方的ETL工具 ...
- SQL 汉字转换成拼音首字母 首字母查
-- ============================================= -- 功能:汉字转换成拼音首字母 首字母查 -- ========================== ...
- 将Microsoft SQL Server 2000数据库转换成MySQL数据库
1. 下载并安装MyODBC.(如果是XP请下载5.3的旧版本,8.x的新版本运行有问题) 2. 创建一个空的MySQL数据库. 3. 在Windows >> 控制面板 >> ...
随机推荐
- msys2安装开发工具
pacman -Syupacman -Supacman -S base-develpacman -S mingw-w64-x86_64-toolchain
- 官方微信接口(全接口) - 微信摇一摇接口/微信多客服接口/微信支付接口/微信红包接口/微信卡券接口/微信小店接口/JSAPI
微信入口绑定,微信事件处理,微信API全部操作包含在这些文件中.微信支付.微信红包.微信卡券.微信小店. 微信开发探讨群 330393916 <?php /** * Description o ...
- powerdesigner解决创建多个表表主键名称重复的问题
选择菜单栏的tools选项,选择Model Options..,选择Model Settings 只要将图片中的选择打钩去掉即可(操作步骤1),同时设置为默认选项(操作步骤2),防止以后问题又出现 ...
- CAS单点登录的原理
1.首先了解几个概念 1).TGC:Ticket-granting cookie,存放用户身份认证凭证的cookie,在浏览器和CAS Server间通讯时使用.2).TGT:ticket grant ...
- 利用基准电压效正Vcc做参考电压的ADC采样计算方法
利用基准电压效正Vcc做参考电压的ADC采样计算方法
- LVS管理工具--ipvsadm
一. ipvsadm工具介绍 从2.4版本开始,linux内核默认支持LVS.要使用LVS的能力,只需安装一个LVS的管理工具:ipvsadm. LVS的结构主要分为两部分: 工作在内核空间的IPVS ...
- Apache 源码包安装
系统:Centos 7.4 服务:Apache 2.4.33.apr 1.5.2.apr-util 1.5.4 依赖包: pcre.x86_64 pcre-devel.x86_64 openssl.x ...
- Zabbix Windos agent 安装
系统:Windos 2008 R2 x64 服务:Zabbix_agents_3.0.4.win 一.安装Zabbix_agents_3.0.4.win 1.下载Zabbix_agents_3.0.4 ...
- Lily hbase indexer搭建配置概要文档
1.solrcloud搭建好2.hbase-solr-indexer服务开启3.确定hbase中的对应的表开启replication功能 create '} // 1表示开启replication 已 ...
- Linux图形化界面下使用命令进行截图的方法
以前在LINUX里面截图都是直接按print screen键或者 alt + print screen. 但是print screen是整个屏幕, alt + print screen是当前窗口. 想 ...