总体来说,sql sever和Mysql的存储过程的思路都是一样的,但是在语法和结构上还是有很大的区别的。
1. 在mysql中写存储过程所有的dbo都要去掉。
2. 每一个sql语句后面都需要加上;否则报错;
4. 再说参数,在MSSQL中我们一般会这么定义参数
1
2
3
4
|
CREATE PROCEDURE PROC_ST
(@operator varchar (300),
@ProcDate datetime, @ErrorLog varchar (8000) OUTPUT )
|
但是在mysql中这种格式是不可以的;
首先在mysql中输入参数是in来表示,输出参数是out表示,如果不写,默认是in,其次在mysql中是没有@符号的,所以所有的@符号都要去掉
上述存储过程改写成mysql的话
1
2
3
4
5
6
|
create PROCEDURE PROC_ST
( in operator varchar (300),
in ProcDate datetime,
out ErrorLog varchar (8000)
) |
5.关于时间的问题
5.1 获取时间格式
在MSSQL中我们来获取时间一般用CONVERT来表示,例如
1
|
set @YearMonth = CONVERT ( varchar (6),@ProcDate,112);
|
这句话的意思就是获取时间的年月并且格式是yyyymm的,112代表的是一种格式;
但是在mysql中我修改的时候却一直报错,所以我换了一种写法
1
|
year (now())*100+ month (now())
|
这样就可以了;
5.2
转换时间格式
同样的,在MSSQL中用CONVERT(varchar(6),参数,112) = @YearMonth 就可以使用,但是在MYSQL中我用的是cast强制转换才可以
1
2
3
4
|
CAST (
REP.FACT_DATE AS CHAR (6) )
|
6.
关于if的使用
在MSSQL中用
If()
Begin
程序片段
End
Else
Begin
程序片段
End就可以;
但是在Mysql中是不认的,if的后面必须有then,而且每一个else if的后面必须有;作为结束符号,否则不管你怎么调试也是过不去的
下面的是我改写的一个函数,比较简单,主要是比较一下语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
CREATE FUNCTIONLOAN_PERIOD
( begindate int ,
enddate int
) RETURNSvarchar(8000) BEGIN if(enddate-begindate <= '3' )
then return '10' ;
end if;
if(enddate-begindate> '3' andenddate-begindate <= '6' )
then return '20' ;
end if;
if(enddate-begindate> '6' andenddate-begindate <= '12' )
then return '30' ;
end if;
return '40' ;
END |
7.关于在时间的增加或者减少
我们一般在MSSQL中想得到日期的上一个月一般会这么写
1
|
CONVERT ( VARCHAR (6),DATEADD ( "Month" , -1, @ProcDate), 112)
|
DATEADD是MSSQL的内置函数;
但是在mysql中是没有这个函数的,那我们应该怎么办呢,别着急,在mysql中有DATE_SUB函数,基本上也能满足我们的需求,上面这句话改写完成后
1
|
CAST (DATE_SUB(ProcDate,INTERVAL1 MONTH ) AS CHAR (6))
|
8.关于表变量
@temp
VARCHAR (MAX);
但是在mysql中没有max这个概念,我一般会用varcahr(8000)来替代,网上众说纷纭,说varchar最大值多少的都有,我没试验过,改写的时候慎用。
11. 在mysql中没有isnull函数,所以我们用ifnull来代替,用法一样;
以上就是我改写的过程中碰到的一些问题,希望对大家能有所帮助吧!
转载请注明:IT运维空间 » lua » sql Sever的存储过程转换为mysql的
发表评论