天天看點

SQL之使用者自定義函數

關于SQL Server使用者自定義的函數,有标量函數、表值函數(内聯表值函數、多語句表值函數)兩種。

題外話,可能有部分朋友不知道SQL Serve使用者自定義的函數應該是寫在哪裡,這裡簡單提示一下,在Microsoft SQL Server Managerment Studio裡面,展開具體需要建立SQL Server使用者自定義函數的資料庫(即每個使用者自定義函數隻針對具體的一個資料庫有用),然後找到可程式設計性選項,再展開找到函數選項,在具體的函數選項裡面可參照下圖的方式滑鼠右鍵選擇來添加。

标量函數

所謂标量函數簡單點來講就是傳回的結果隻是一個标量,對于我來講,傳回的結果就是一種類型的一個值。

寫法如下:

<a></a>

例子:

 題外話:我們來看看上面的寫法,對于SQL Server來講,我們聲明一個變量的方式是用@變量名,而且相對于程式設計來講,SQL Server聲明的方式跟我們開了個玩笑,是先變量後面才是類型。對于需要傳參跟不需要傳參的方式,其實跟我們程式設計的方式一樣。有參數則是如下方式:

如果沒有參數,則隻要保留括号即可。跟我們了解的函數寫法一緻。

對于傳回方式,這跟我們程式設計的方式又不大一樣。SQL Server函數的傳回類型并不放在函數名前面,而是函數名括号的後面。而且函數的傳回類型需要用到傳回關鍵字RETURNS,而不是RETURN。

對于函數來講,當然也會有所謂的函數體。标量函數也一樣。它的函數體是包含在:

對于需要在函數體裡面聲明變量的話,則需要使用到DECLARE關鍵字進行聲明。函數體内的傳回才是關鍵字RETURN。 

好了,标量函數的例子也舉完了,要存到資料庫裡面,還需要點選Microsoft SQL Server Management Studio工具裡的執行操作。這樣之後,就可以在查詢視窗裡面跟查詢表資料一樣來查詢結果了。

使用方式好懂吧,但是需要注意的是[dbo]這個對象名在不能省,[GetSum]函數後面可也别少了()。說來也奇怪,對于表值函數來說,對象名[dbo]倒是不寫也可以正确執行。

内聯表值函數

 相對于标量函數隻傳回一個标量值,内聯表值函數傳回的是表資料。當然羅,表資料就是Table類型。

題外話:标量函數上面提過的内容,這裡就不重複了。内聯表函數傳回的表結構由函數體内的SELECT語句來決定。

對于标量函數來講,函數體是包含在如下結構中。

但是對于内聯表值函數來講,函數體的結構則是如下的方式。内聯表值函數隻執行一條SQL語句後傳回Table結果。

執行表值函數的方式如下:

可以看得出,這種執行方式就跟普通表的執行方式一樣了。表值函數其實相當于存儲在記憶體空間裡面的一張虛拟表。

多語句表值函數

 多語句表值函數跟内聯表值函數都是表值函數,它們傳回的結果都是Table類型。多語句表值函數顧名思義,就是可以通過多條語句來建立Table類型的資料。這裡不同于内聯表值函數,内聯表值函數的傳回結果是由函數體内的SELECT語句來決定。而多語句表值函數,則是需要指定具體的Table類型的結構。也就是說傳回的Table,已經定義好要哪些字段傳回。是以它能夠支援多條語句的執行來建立Table資料。

題外話:可以看得出,多語句表值函數的傳回結果是定義好表結構的虛拟表。這又跟标量函數一樣了吧,隻不過标量函數是傳回一種類型的标量值而已。而且在多語句表值函數裡面,你也會發現最後一句是RETURN。告訴執行程式,多語句表值函數已經執行完成。函數體結構跟标量函數的結構一樣。對于類型放在變量後面這種方式确實需要好好轉換一下觀念。

内容倒是不多,但是要熟練使用的話,還是需要在項目中多加使用才行。網上有一些網友總結出來的常用自定義函數大家可以收集積累,就像做項目一樣,好的方法要形成所謂的開發庫,幫助我們在下一個項目中複用。節省我們的開發時間,提高我們的工作效率。

至此,本文完。

本文轉自二郎三郎部落格園部落格,原文連結:http://www.cnblogs.com/haore147/p/3902988.html,如需轉載請自行聯系原作者