sql Sever的存储过程转换为mysql的

总体来说,sql sever和Mysql的存储过程的思路都是一样的,但是在语法和结构上还是有很大的区别的。

1. 在mysql中写存储过程所有的dbo都要去掉。

2. 每一个sql语句后面都需要加上;否则报错;

4. 再说参数,在MSSQL中我们一般会这么定义参数

1

2

3

4

CREATEPROCEDUREPROC_ST

(@operatorvarchar(300),

@ProcDate datetime,

@ErrorLogvarchar(8000)OUTPUT)

但是在mysql中这种格式是不可以的;

首先在mysql中输入参数是in来表示,输出参数是out表示,如果不写,默认是in,其次在mysql中是没有@符号的,所以所有的@符号都要去掉

上述存储过程改写成mysql的话

1

2

3

4

5

6

createPROCEDUREPROC_ST

(

inoperatorvarchar(300),

inProcDate datetime,

outErrorLogvarchar(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

CREATEFUNCTIONLOAN_PERIOD

(

begindateint,

enddateint

)

RETURNSvarchar(8000)

BEGIN

if(enddate-begindate <='3')

then

return'10';

endif;

if(enddate-begindate>'3'andenddate-begindate <='6')

then

return'20';

endif;

if(enddate-begindate>'6'andenddate-begindate <='12')

then

return'30';

endif;

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,INTERVAL1MONTH)ASCHAR(6))

8.关于表变量

@temp

VARCHAR (MAX);

但是在mysql中没有max这个概念,我一般会用varcahr(8000)来替代,网上众说纷纭,说varchar最大值多少的都有,我没试验过,改写的时候慎用。

11. 在mysql中没有isnull函数,所以我们用ifnull来代替,用法一样;

以上就是我改写的过程中碰到的一些问题,希望对大家能有所帮助吧!