标签:
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 top 10 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; |
标签:
原文地址:http://www.cnblogs.com/dusongshell/p/5434072.html