mssql 存储过程转mysql_sql Sever的存储过程如何转换为mysql

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

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

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

2. 在sql sever中查询分析器直接用create PROCEDURE就可以,但是在mysql中必须用DELIMITER

$$来开头,因为在mysql中认定“;”为结束符号,所以我们必须要改变结束符号, $$的意思就是在后续的运行过程中如果碰到$$,那么就

可以认定程序结束了,在最后的end 后面加上$$ 就可以了!

DELIMITER

$$

BEGIN

create PROCEDURE PROC_

end $$

DELIMITER;

3.

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

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

CREATE PROCEDURE PROC_ST

(@operator varchar(300),

@ProcDate datetime,

@ErrorLog varchar(8000) OUTPUT)

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

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

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

create PROCEDURE PROC_ST

(

in operator varchar(300),

in

ProcDate datetime,

out

ErrorLog varchar(8000)

)

5.关于时间的问题

5.1 获取时间格式

在MSSQL中我们来获取时间一般用CONVERT来表示,例如

set@YearMonth = CONVERT(varchar(6),@ProcDate,112);

这句话的意思就是获取时间的年月并且格式是yyyymm的,112代表的是一种格式;

但是在mysql中我修改的时候却一直报错,所以我换了一种写法

year(now())*100+month(now())这样就可以了;

5.2

转换时间格式

同样的,在MSSQL中用CONVERT(varchar(6),参数,112) = @YearMonth 就可以使用,但是在MYSQL中我用的是cast强制转换才可以

CAST(

REP.FACT_DATE

AS

CHAR(6) )

6.

关于if的使用

在MSSQL中用

If()

Begin

程序片段

End

Else

Begin

程序片段

End就可以;

但是在Mysql中是不认的,if的后面必须有then,而且每一个else if的后面必须有;作为结束符号,否则不管你怎么调试也是过不去的

下面的是我改写的一个函数,比较简单,主要是比较一下语法

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中想得到日期的上一个月一般会这么写

CONVERT (VARCHAR(6),DATEADD ("Month", -1, @ProcDate), 112)

DATEADD是MSSQL的内置函数;

但是在mysql中是没有这个函数的,那我们应该怎么办呢,别着急,在mysql中有DATE_SUB函数,基本上也能满足我们的需求,上面这句话改

写完成后

CAST(DATE_SUB(ProcDate,INTERVAL1 MONTH) AS CHAR(6))

8.关于表变量

在MYsql中时不存在表变量这个概念的,但是却可以用临时表来代替,在Mysql中我们创业临时表一般用

CREATEtemporary

table tempTotal 来进行创建,还有一点好处,就是临时变量在存储过程执行完会自动释放,不会占用大量内存;

9.在MSSQL中会常常用到下面这个声明

DECLARE@temp

VARCHAR (MAX);

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

时候慎用。

10.在MSSQL中金融产品化会常常用到下面这个声明

DECLARE@temp

VARCHAR (MAX);

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

时候慎用。

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

Select top10 bid from books

Select bid from books limit 0,10

select bsid=@@IDENTITY

select bsid=LAST_INSERT_ID()

If xxx

Begin

--------

End

Else if xxx

Begin

end

If xxx then

--------

else

if xxx then

-----

end if;

end if;

exec sp a,b,c

Call sp(a,b,c)

getdate()

now()

day(xx)

dayofmonth(xx)

Create procedure xxx @a int @b varchar(100)

As

Create procedure xxx (a int,b varchar(100))

Begin

End

动态sql语句Exec(‘xxxx’)

在任何位置均可声明

Sp内部必需在一开始就声明

不需要

除控制语句,句子后面必需加分号

Cast(a as xxx)

如果是转为字符串,最好用CONCAT()

with (nolock)

没找到对应的,

Create proc

没有proc缩写,必需改为create procedure

跨数据库访问[xx].[dbo].[aaa]

省略dbo: xx.aaa

update bookvotes set a.votes=a.votes+(select sum(starVotes) from bookreviews where bid=a.bid) from bookvotes a,bookreviews b

where a.status=0 and a.bid=b.bid and b.status=1;

update bookvotes a,bookreviews b set a.votes=a.votes+(select sum(starVotes) from bookreviews where bid=a.bid)

where a.status=0 and a.bid=b.bid and b.status=1;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值