標籤:
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來表示,例如
[email protected] = 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中會常常用到下面這個聲明
[email protected]
VARCHAR (MAX);
但是在mysql中沒有max這個概念,我一般會用varcahr(8000)來替代,網上眾說紛紜,說varchar最大值多少的都有,我沒實驗過,改寫的
時候慎用。
10.在MSSQL中金融產品化會常常用到下面這個聲明
[email protected]
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[email protected]@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; |
sql Sever的預存程序如何轉換為mysql