sql Sever的儲存過程轉換為mysql的
from : http://www.cnblogs.com/huxiaolin/p/4671039.html
總體來說,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中輸入引數是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.關於表變數
在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來代替,用法一樣;
以上就是我改寫的過程中碰到的一些問題,希望對大家能有所幫助吧!