A.show variables like '%func%';查看是否开启了,如果结果为off,则开启:
set global log_bin_trust_function_creators=1;
B.命名最好有前缀,不然很容易
a.mysql普通变量名没有mssql的@符号
b.mysql用concat连接字符串,mssql用+号
c.创建的时候mssql里begin前面的as在mysql里面就丢掉吧
d.select查询结果集赋值:
mssql是select @a=a,@b=b from tablename;
mysql是select a,b into a,b from tablename;a,b默认就给解析为变量了
e.mysql每句话都要加分号 ;很贱的哦
f.mssql注释语句可以随便加哪里例如--这是注释,但是mysql注释只能--这是注释,--后面必须有个空格才能写中文
g:系统内置函数
cast和convert:只能手工翻译重写啊 mssql中cast(*** as varchar),convert(varchar,***),as后面的参数不能再用varchar,int这些了,要用以下这些值:
给结果集赋值并累计结果值(declare res='';select res=concat(res,usernmae) from users),mysql不支持在自定义函数,只能写在存储过程里面
h:mysql中没有表变量这一概念,只有临时表,详解看这里http://www.cnblogs.com/jinzhenshui/archive/2009/06/14/1503123.html
i:mssql中select @str=@str+username from users;等同于select group_concat(username) as col into str from users;,group_concat详细http://blog.csdn.net/lifuxiangcaohui/article/details/6132147
j:创建临时表语句也不同
mssql 只要在表名前面加#就可以了,mysql要声明temporary,并且自增和主键写法也不同
create temporary table fun_table_forty_more(table_forty_more_id int auto_increment,id int,num int,primary key(table_forty_more_id)) ;自定义函数和促发器不能使用这样的事务类语句 drop table if exists fun_table_temp;
k:mysql中if语句只有后面end if要分号,其他都不要
if fun_records = 0 -- 无分号 then -- 无分号 set fun_records = 150;-- 有分号 <pre name="code" class="sql"> set fun_records = 150;
end if;
h:语句中变量like concat('%',fun_classname,'%');like可以后面concat变量,limit等等就不行,要用动态执行的形式了
i: funsql是sql结果变量,动态执行语句如下
set @pre_funsql=fun_sql; PREPARE execsql from @pre_funsql; EXECUTE execsql; DEALLOCATE PREPARE execsql;
j:order by charindex不一样,参照http://blog.csdn.net/wendi_0506/article/details/38872731
k:MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME 错误
比如这样的语句是不能正确执行的。 select * from table where id in (select id from table limit 12); 但是,只要你再加一层就行。如: select * from table where id in (select t.id from (select * from table limit 12)as t) 这样就可以绕开limit子查询的问题。 问题解决。l:declare必须声明在最上面,不然语法报错