我勒個去... 這標題如此粗魯,誰起的? 改過來... 呵呵,管他呢!老師說不要在乎這些細節. 我們開始我們的話題,這里我們要討論的是 SQL 中的表值函數. 對于熟悉他的同胞們可能本文沒有多大的意義,但是對于剛入門的童鞋還是比較有用的. 筆者剛開始接觸的時候也是
我勒個去... 這標題如此粗魯,誰起的? 改過來... 呵呵,管他呢!老師說不要在乎這些細節.
我們開始我們的話題,這里我們要討論的是 SQL 中的表值函數.
對于熟悉他的同胞們可能本文沒有多大的意義,但是對于剛入門的童鞋還是比較有用的.
筆者剛開始接觸的時候也是費了很大勁(可能本人比較笨!呵呵),在此以一個簡單而又簡明的例子來討論這個看似神奇的東西.
所謂的表值函數,就是用戶自定義的函數.
"表值" 表示它返回的值是一張表.
表值函數又分為內聯表值函數和多語句表值函數(其實某個角度也是一樣樣兒的,別被弄糊涂了).
我們先看內聯表值函數,下面我們就打開我們的 SQL 語句編輯工具,我們寫第一個內聯表值函數.
咱先不心慌,既然叫 "函數",那么他肯定具有函數的特征,猜猜... 如 括號,參數...
對! 它的語法并不難:
CREATE FUNCTION 函數名 (參數,參數...) RETURNS TABLE
AS
RETURN
(
語句
)
GO
首先是 CREATE FUNCTION 表示創建函數,括號中是參數列表.
RETURNS TABLE 表示返回值是一個表.
AS 后面的 RETURN(語句) 就是函數執行的部分.
內聯表值函數和多語句表值函數的區別其實就是內部的 SQL 查詢語句的條數,以及寫法稍有不同而已.
我們也來實干一下:
CREATE FUNCTION MYFUN (@NUMBER1 INT,@NUMBER2 INT)
RETURNS TABLE
AS
RETURN( select @NUMBER1+@NUMBER2 AS RESULT)
--該函數做的事情很簡單,就是把傳入的兩個值相加(當然這個例子嚴格說不是很好,因為你如果知道"標量值函數"且有不大區分得開,那就容易混淆了,但這里只是為了簡潔)
聲明了一個函數,參數為 @NUBMER1 和 @NUMBER2 兩個 INT 類型的參數,標記返回值是 TABLE .
然后返回兩個值相加的結果,由于這里返回的表列是 "匿名" 形式,所以必須對列起別名,這里叫 "RESULT".
調用函數:
SELECT * FROM MYFUN(2,3)
--當然返回的就是 5 了
看到這種調函數的方法,是不是你和小伙伴們都驚呆了? 開句玩笑.. 但這玩意是否有些出乎你的意料?
別急,想想,既然是表值函數,關鍵是返回的是 "婊",奧! 不對,是 "表" 那么我們在查詢(調用函數就相當于在查詢這張返回的表) 的時候是不是應該按照 SQL 中查表的方式呢?
對了,這不就想通了嗎? 耶! 壯哉我大中華.. (貌似也扯不上半毛錢關系 呵呵)
和她零距離接觸后,我們沒了興趣,那好,我們頭腦風暴一下,看看下面這是啥...
(似乎這家伙看上去很厲害的樣子... 她是干啥的? 會不會... 自己想去!)
CREATE FUNCTION MYFUN(@NUMBER1 INT,@NUMBER2 INT)
RETURNS @TAB TABLE(RESULT NVARCHAR(32))
AS
BEGIN
INSERT INTO @TAB SELECT @NUMBER1+@NUMBER2
UPDATE @TAB SET RESULT = RESULT * 10
RETURN
END
GO
--經過一場苦逼的頭腦風暴,我們郁悶了,好的是聰明的你已經猜對了,它就是多語句表值函數
你可能會說,丫的,這里邊的語句是多了,但是也沒看出來它和內聯表值函數有啥端倪丫...
前面也說過了,內聯表值函數和多語句表值函數的不同就是在內部的SQL 語句數量.
上面的例子可以看出,我一條語句是填充 @TAB 表,另一個是更新它 RESULT 列的值,而這在內聯表值函數的 RETURN(...) 括號中是不允許的,因為它的括號里只允許一條語句.
一條以上就會報錯的.
值得一提的是,在多語句表值函數中,必須有"返回語句" 也就是 RETURN 標志,因為它不像內聯表值函數那樣早早就標明了 RETURN(語句) ,而是要手動的返回.
第二個注意的地方是,在多語句表值函數中,聲明的返回表,在返回之前(RETURN) 必須有數據(哪怕是空),換句話說就是必須要把它進行初始化,否則就會報錯"函數內包含的** 語句無法向客戶端返回數據".
事就這么個事,現在我們猛然發現,其實表值函數也沒什么難的,對吧?
本例子舉例比較簡單,當然你參透了之后,可以盡情的用它來做 "大事",不要吝嗇! 呵呵
好的! 夜深了,至此,我們已經揭開了它的面紗,它已經裸露在你面前,你和你的小伙伴們都驚呆了...
呵呵 開句玩笑! 再見!
>>溫馨提示: 代碼本身很純潔,沒有錯誤,但是如果你 copy 到SQL 編輯器中報錯的話,請嘗試刪除縮進的部分或者是重新替換掉它們(因為博客編輯器中的制表符貌似在 SQL 編輯器中有出入)
,聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com