前面的高階篇講到的跨庫查詢以及鏈結伺服器相關知識,本篇著重介紹sql中的儲存過程與函式。為什麼放在一起講,一是因為單獨講儲存過程或者函式,其實就那麼多東西,再者是因為這兩類物件有一定的相似性。廢話不多說,我們進入主題。
一、sql的儲存過程:
儲存過程其實就是一系列sql語句的集合體,我們可以理解為乙個封裝單元,這個單元可以有出入引數,也可以沒有。我們舉幾個簡單的例子:
(1)無入參無出參的儲存過程:
create
proc usp_test
asupdate stu set s***=
'0'where s***=
''return
exec usp_test
注意:執行儲存過程用:exec 儲存過程名 引數1,引數2… 結果如下:
(2)無入參有出參的儲存過程:
alter
proc usp_test
asupdate stu set s***=
'0'where s***=
''select
*from stu where s***=
'0'return
exec usp_test
注意:修改儲存過程用alter,執行結果如下:
(3)有入參無出參的儲存過程:
alter
proc usp_test
@age
intas
update stu set s***=
'1'where sage>=
@age
return
exec usp_test 20
注意:還記得變數的用法嗎?這裡就是將變數用到儲存過程裡了。![](https://pic.w3help.cc/f68/2ec6a6637858963c7fdc7b650985c.jpeg)
(4)有入參有出參的儲存過程:
alter
proc usp_test
@age
intas
update stu set s***=
'1'where sage>=
@age
select
*from stu where s***=
'1'return
exec usp_test 20
注意: 這個儲存過程就是兩條sql語句的集合,執行結果如下:
綜合以上幾個例子,我們能看到儲存過程的建立、修改基本格式,當使用入參時怎麼更新和返回資料等,其實再複雜的儲存過程,都是由一條條簡單的語句集合而成的。要理解儲存過程,首先心理上不要有犯難和逃避,不能一看到**多了就扭頭不想理,正視它你才能搞定它。
接著說函式,開篇也說到,函式和儲存過程有很大的相似性,也是一堆**的集合,也有出入參。
比如下面的例子,我們做個算年齡的函式,有點難度,看仔細了:
create
function age_cs
(@ksrq
date
,@jsrq
date
)returns
varchar(16
)asbegin
declare
@days
int,
@year
int,
@day
int,
@age
varchar(16
)select
@days
=datediff(
day,
@ksrq
,@jsrq
)select
@year
=@days
/365
select
@day
=@days
%365
select
@age
=convert
(varchar(3
),@year)+
'歲'+
convert
(varchar(3
),@day)+
'天'return
(@age
)end
我們先呼叫一下,看看結果,然後再解釋**的意思:
解析:(1)函式的入參必須用括號包住,定義完入參以後緊接著就需要定義返回的引數型別,正文部分必須用begin…end包裹住;
(2)我們先定義了四個變數:@days總天數, @year年數,@day天數,@age輸出的年齡。
先用datediff函式算出總天數,然後年數等於總天數除以365得到的整數,因為兩個欄位都是int型的,所以直接除下來不會有小數。
再用總天數%365得到餘天數,注意%是取餘的意思。
最後我們再把算出來的年齡,拼接起來賦值給@age。
(3)用return(@age) 輸出結果。
這樣,我們就得到了算年齡的函式,把它建立在資料庫裡,隨時想用就隨時調,不用再每次都去寫一大段語句。
那麼綜合上面講到的儲存過程和函式的使用,總結如下:
(1)儲存過程和函式都可以將一段sql語句進行封裝,這樣大大的方便了實際使用時候的呼叫步驟;
(2)儲存過程裡面可以巢狀儲存過程,也經常會呼叫各種函式;
(3)函式裡面可以呼叫其他函式,但是一般不巢狀儲存過程;
(4)上面例子中的函式,也可以改寫成儲存過程,但是函式使用起來要方便的多,因為函式可以直接用select聯用,但是儲存過程只能用exec執行。
儲存過程與SQL的對比?
優勢 1 提高效能 sql語句在建立過程時進行分析和編譯。儲存過程是預編譯的,在首次執行乙個儲存過程時,查詢優化器對其進行分析 優化,並給出最終被存在系統表中的儲存計畫,這樣,在執行過程時便可節省此開銷。2 降低網路開銷 儲存過程呼叫時只需用提供儲存過程名和必要的引數資訊,從而可降低網路的流量。3 ...
sql儲存過程與webMethods
今天嘗試著做之前用webmethods沒做出來的sql儲存過程的使用,因為本來對於資料庫的儲存過程也是一知半解,所以先在上學習了一下。先在sql中寫好有輸入輸出的儲存過程,典型一點好做實驗。在webmethods中需要先做好的準備有 安裝好sql與webmehtods,在is伺服器上配置好sql的j...
基本技能篇 SQL 的變數
變數,是相對於常量而言的乙個概念,字面的意思常量就是乙個不變的值,如1,2,3,4,5,6 a,bc之類的,變數就是乙個可變的值。變數可分為區域性變數和全域性變數,區域性變數需要預先定義,前面以乙個 開頭,常於declare聯用,全域性變數可以看作是系統變數,不用定義可以直接呼叫,前面以兩個 開頭。...