sql Sever的存儲過程如何轉換爲mysql

[原文: http://bbs.51cto.com/thread-1115779-1.html ]

前一段時間,領導安排一個大概sql sever的300多行的存儲過程轉換成mysql的,把心得寫出來與大家分享一下,如果有哪些地方不對,或者寫的不好的地方,歡迎大家指出!一起學習,一起進步。

總體來說,sql severMysql的存儲過程的思路都是一樣的,但是在語法和結構上還是有很大的區別的。
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)
DATEADDMSSQL的內置函數;
但是在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這個概念,我一般會用varcahr8000)來替代,網上衆說紛紜,說varchar最大值多少的都有,我沒試驗過,改寫的時候慎用。
10.MSSQL中金融產品化會常常用到下面這個聲明
DECLARE@temp
VARCHAR (MAX);

但是在mysql中沒有max這個概念,我一般會用varcahr8000)來替代,網上衆說紛紜,說varchar最大值多少的都有,我沒試驗過,改寫的時候慎用。
11. mysql中沒有isnull函數,所以我們用ifnull來代替,用法一樣;




以上就是我改寫的過程中碰到的一些問題,希望對大家能有所幫助吧!
發佈了67 篇原創文章 · 獲贊 16 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章