關(guān)于SQL Server用戶(hù)自定義的函數(shù),有標(biāo)量函數(shù)、表值函數(shù)(內(nèi)聯(lián)表值函數(shù)、多語(yǔ)句表值函數(shù))兩種。
目前創(chuàng)新互聯(lián)公司已為上千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計(jì)、曲阜網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶(hù)導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶(hù)和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
題外話,可能有部分朋友不知道SQL Serve用戶(hù)自定義的函數(shù)應(yīng)該是寫(xiě)在哪里,這里簡(jiǎn)單提示一下,在Microsoft SQL Server Managerment Studio里面,展開(kāi)具體需要?jiǎng)?chuàng)建SQL Server用戶(hù)自定義函數(shù)的數(shù)據(jù)庫(kù)(即每個(gè)用戶(hù)自定義函數(shù)只針對(duì)具體的一個(gè)數(shù)據(jù)庫(kù)有用),然后找到可編程性選項(xiàng),再展開(kāi)找到函數(shù)選項(xiàng),在具體的函數(shù)選項(xiàng)里面可參照下圖的方式鼠標(biāo)右鍵選擇來(lái)添加。
標(biāo)量函數(shù) |
所謂標(biāo)量函數(shù)簡(jiǎn)單點(diǎn)來(lái)講就是返回的結(jié)果只是一個(gè)標(biāo)量,對(duì)于我來(lái)講,返回的結(jié)果就是一種類(lèi)型的一個(gè)值。
寫(xiě)法如下:
-- ============================================= -- Author:-- Create date: -- Description: -- ============================================= CREATE FUNCTION ( -- Add the parameters for the function here <@Param1, sysname, @p1> ) RETURNS AS BEGIN -- Declare the return variable here DECLARE <@ResultVar, sysname, @Result> -- Add the T-SQL statements to compute the return value here SELECT <@ResultVar, sysname, @Result> = <@Param1, sysname, @p1> -- Return the result of the function RETURN <@ResultVar, sysname, @Result> END
例子:
-- ============================================= -- Author:-- Create date: -- Description: -- ============================================= CREATE FUNCTION GetSum ( @firstNum int, @secondNum int ) RETURNS int AS BEGIN -- Declare the return variable here DECLARE @result int -- Add the T-SQL statements to compute the return value here SELECT @result=@firstNum+@secondNum -- Return the result of the function RETURN @result END GO
題外話:我們來(lái)看看上面的寫(xiě)法,對(duì)于SQL Server來(lái)講,我們聲明一個(gè)變量的方式是用@變量名,而且相對(duì)于編程來(lái)講,SQL Server聲明的方式跟我們開(kāi)了個(gè)玩笑,是先變量后面才是類(lèi)型。對(duì)于需要傳參跟不需要傳參的方式,其實(shí)跟我們編程的方式一樣。有參數(shù)則是如下方式:
CREATE FUNCTION GetSum ( @firstNum int, @secondNum int )
如果沒(méi)有參數(shù),則只要保留括號(hào)即可。跟我們理解的函數(shù)寫(xiě)法一致。
CREATE FUNCTION GetSum ( )
對(duì)于返回方式,這跟我們編程的方式又不大一樣。SQL Server函數(shù)的返回類(lèi)型并不放在函數(shù)名前面,而是函數(shù)名括號(hào)的后面。而且函數(shù)的返回類(lèi)型需要用到返回關(guān)鍵字RETURNS,而不是RETURN。
對(duì)于函數(shù)來(lái)講,當(dāng)然也會(huì)有所謂的函數(shù)體。標(biāo)量函數(shù)也一樣。它的函數(shù)體是包含在:
AS BEGIN -- 函數(shù)體 END
對(duì)于需要在函數(shù)體里面聲明變量的話,則需要使用到DECLARE關(guān)鍵字進(jìn)行聲明。函數(shù)體內(nèi)的返回才是關(guān)鍵字RETURN。
好了,標(biāo)量函數(shù)的例子也舉完了,要存到數(shù)據(jù)庫(kù)里面,還需要點(diǎn)擊Microsoft SQL Server Management Studio工具里的執(zhí)行操作。這樣之后,就可以在查詢(xún)窗口里面跟查詢(xún)表數(shù)據(jù)一樣來(lái)查詢(xún)結(jié)果了。
使用方式好懂吧,但是需要注意的是[dbo]這個(gè)對(duì)象名在不能省,[GetSum]函數(shù)后面可也別少了()。說(shuō)來(lái)也奇怪,對(duì)于表值函數(shù)來(lái)說(shuō),對(duì)象名[dbo]倒是不寫(xiě)也可以正確執(zhí)行。
select [dbo].[GetSum]()
內(nèi)聯(lián)表值函數(shù) |
相對(duì)于標(biāo)量函數(shù)只返回一個(gè)標(biāo)量值,內(nèi)聯(lián)表值函數(shù)返回的是表數(shù)據(jù)。當(dāng)然羅,表數(shù)據(jù)就是Table類(lèi)型。
寫(xiě)法如下:
-- ============================================= -- Author:-- Create date: -- Description: -- ============================================= CREATE FUNCTION ( -- Add the parameters for the function here <@param1, sysname, @p1> , <@param2, sysname, @p2> ) RETURNS TABLE AS RETURN ( -- Add the SELECT statement with parameter references here SELECT 0 ) GO
例子:
-- ============================================= -- Author:-- Create date: -- Description: -- ============================================= CREATE FUNCTION [GetMoreThanSalary] ( @salary int ) RETURNS TABLE AS RETURN ( SELECT [FName],[FCity],[FAge],[FSalary] FROM [Demo].[dbo].[T_Person] Where [FSalary] > @salary ) GO
題外話:標(biāo)量函數(shù)上面提過(guò)的內(nèi)容,這里就不重復(fù)了。內(nèi)聯(lián)表函數(shù)返回的表結(jié)構(gòu)由函數(shù)體內(nèi)的SELECT語(yǔ)句來(lái)決定。
對(duì)于標(biāo)量函數(shù)來(lái)講,函數(shù)體是包含在如下結(jié)構(gòu)中。
AS BEGIN -- 函數(shù)體 END
但是對(duì)于內(nèi)聯(lián)表值函數(shù)來(lái)講,函數(shù)體的結(jié)構(gòu)則是如下的方式。內(nèi)聯(lián)表值函數(shù)只執(zhí)行一條SQL語(yǔ)句后返回Table結(jié)果。
AS RETURN -- 函數(shù)體 END
執(zhí)行表值函數(shù)的方式如下:
select [FName],[FCity],[FAge],[FSalary] from [dbo].[GetMoreThanSalary](8000)
可以看得出,這種執(zhí)行方式就跟普通表的執(zhí)行方式一樣了。表值函數(shù)其實(shí)相當(dāng)于存儲(chǔ)在內(nèi)存空間里面的一張?zhí)摂M表。
多語(yǔ)句表值函數(shù) |
多語(yǔ)句表值函數(shù)跟內(nèi)聯(lián)表值函數(shù)都是表值函數(shù),它們返回的結(jié)果都是Table類(lèi)型。多語(yǔ)句表值函數(shù)顧名思義,就是可以通過(guò)多條語(yǔ)句來(lái)創(chuàng)建Table類(lèi)型的數(shù)據(jù)。這里不同于內(nèi)聯(lián)表值函數(shù),內(nèi)聯(lián)表值函數(shù)的返回結(jié)果是由函數(shù)體內(nèi)的SELECT語(yǔ)句來(lái)決定。而多語(yǔ)句表值函數(shù),則是需要指定具體的Table類(lèi)型的結(jié)構(gòu)。也就是說(shuō)返回的Table,已經(jīng)定義好要哪些字段返回。所以它能夠支持多條語(yǔ)句的執(zhí)行來(lái)創(chuàng)建Table數(shù)據(jù)。
寫(xiě)法如下:
-- ============================================= -- Author:-- Create date: -- Description: -- ============================================= CREATE FUNCTION ( -- Add the parameters for the function here <@param1, sysname, @p1> , <@param2, sysname, @p2> ) RETURNS <@Table_Variable_Name, sysname, @Table_Var> TABLE ( -- Add the column definitions for the TABLE variable here , ) AS BEGIN -- Fill the table variable with the rows for your result set RETURN END GO
例子:
-- ============================================= -- Author:-- Create date: -- Description: -- ============================================= ALTER FUNCTION DemoFun ( ) RETURNS @result TABLE ( name nvarchar(20), city nvarchar(20), age int, salary int ) AS BEGIN -- Fill the table variable with the rows for your result set insert into @result(name, city, age, salary) select FName,FCity,FAge,FSalary from dbo.T_Person where FSalary>8000 insert into @result(name, city, age, salary) values ('測(cè)試','China', 1, 0) RETURN END GO
題外話:可以看得出,多語(yǔ)句表值函數(shù)的返回結(jié)果是定義好表結(jié)構(gòu)的虛擬表。這又跟標(biāo)量函數(shù)一樣了吧,只不過(guò)標(biāo)量函數(shù)是返回一種類(lèi)型的標(biāo)量值而已。而且在多語(yǔ)句表值函數(shù)里面,你也會(huì)發(fā)現(xiàn)最后一句是RETURN。告訴執(zhí)行程序,多語(yǔ)句表值函數(shù)已經(jīng)執(zhí)行完成。函數(shù)體結(jié)構(gòu)跟標(biāo)量函數(shù)的結(jié)構(gòu)一樣。對(duì)于類(lèi)型放在變量后面這種方式確實(shí)需要好好轉(zhuǎn)換一下觀念。
RETURNS <@Table_Variable_Name, sysname, @Table_Var> TABLE ( -- Add the column definitions for the TABLE variable here, )
內(nèi)容倒是不多,但是要熟練使用的話,還是需要在項(xiàng)目中多加使用才行。網(wǎng)上有一些網(wǎng)友總結(jié)出來(lái)的常用自定義函數(shù)大家可以收集積累,就像做項(xiàng)目一樣,好的方法要形成所謂的開(kāi)發(fā)庫(kù),幫助我們?cè)谙乱粋€(gè)項(xiàng)目中復(fù)用。節(jié)省我們的開(kāi)發(fā)時(shí)間,提高我們的工作效率。
至此,本文完。