sqlserver和mysql 函式function、儲存過程的建立及異同
前言
函式能在查詢語句中使用比如
select * from store where Get_CityAndProvince(area) like '杭州市'
Get_CityAndProvince()就是函式。
儲存過程單獨使用,是用來完成一些複雜邏輯的,可以進行增刪改。
儲存過程也相當與一個函式,之所以這麼說,一來是它們很相似,二來是因為在有些資料庫管理工具如Navicat中,是把儲存過程和函式統一放在函式目錄下的。
函式
函式的必要性
遇到一個需求,根據地圖頁面輸入的城市名字來顯示出資料庫中存在的當前城市中店鋪。資料庫中的店鋪的地址欄位儲存的是”省份,城市,區縣”或”省份,城市”或”省份”格式。需要取出城市來進行匹配,可是儲存格式不一樣根據逗號擷取需要判斷逗號數量。
如果在應用程式中的解決的話,就是每次取出資料庫所有店鋪到程式中,然後在應用程式中判斷地址的格式,根據不同的格式取出城市。
更好的解決方法就是使用資料庫函式,我們只需要建立一個數據庫函式,將判斷步驟放在資料庫,這樣應用程式取出的直接是符合查詢的資料。
函式的建立
來建立一個判斷整數是否大於0的函式。
-- mysql函式
create function ispositive( num int )
returns TINYINT
begin
declare result tinyint;
if num >0 then
set result=true;
else
set result=false;
end if;
return result;
end;
select ispositive(1)
-- sqlserver函式
create FUNCTION IsPositive( @num int )
returns bit
as
begin
declare @result bit
if @num>0
set @result= 1
else
set @result =0
return @result
end
go
select dbo.ispositive(1)
注意:宣告函式返回資料型別的關鍵字是returns不是return!使用者定義函式中,用RETURNS 子句指定該函式返回值的資料型別。
儲存過程
-- mysql儲存過程
create procedure up_ispositive (num int)
begin
if num>0 then
select 1;
else
select 0;
end if;
end;
call up_ispositive(1)
-- sqlserver儲存過程
create proc up_ispositive @num int
as
begin
if @num>0
select 1
else
select 0
end
go
exec up_ispositive -1
總結
1.變數的宣告和使用:sqlserver加@,mysql不加@。
2.分號問題:sqlserver加不加分號都可以,在mysql中是必加的。
3.as問題:宣告函式(包括儲存過程)時,sqlserver加as,mysql不加;在建立檢視時都要加
4.括號問題:SQLserver函式必須有括號,儲存過程可以加可以不加;mysql函式和儲存過程都要加。 【加括號就對了】
5.begin-end問題:sqlserver和mysql都要加。
6.呼叫儲存過程:SQLserver使用exec,mysql使用call。
7.if流程控制:
SQLserver普通的if-else就行了,mysql的語法是
if num >0 then
set result=true;
else
set result=false;
end if;
8.注意:宣告函式返回資料型別的關鍵字是returns不是return!使用者定義函式中,用RETURNS 子句指定該函式返回值的資料型別。
9.以上總結來自sqlserver2008和mysql6.10.6,不同版本可能有異。