高階技能篇 SQL的儲存過程與函式

2021-10-19 11:11:02 字數 3148 閱讀 6856

前面的高階篇講到的跨庫查詢以及鏈結伺服器相關知識,本篇著重介紹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

注意:還記得變數的用法嗎?這裡就是將變數用到儲存過程裡了。

(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聯用,全域性變數可以看作是系統變數,不用定義可以直接呼叫,前面以兩個 開頭。...