php:SQL Server使用者自訂的函數種類詳解

來源:互聯網
上載者:User
關於SQL Server使用者自訂的函數,有純量涵式、資料表值函式(內聯資料表值函式、多語句資料表值函式)兩種。

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

所謂純量涵式簡單點來講就是返回的結果只是一個標量,對於我來講,返回的結果就是一種類型的一個值。

寫法如下:

CREATE FUNCTION <Scalar_Function_Name, sysname, FunctionName> (    -- Add the parameters for the function here    <@Param1, sysname, @p1> <Data_Type_For_Param1, , int>)RETURNS <Function_Data_Type, ,int>ASBEGIN    -- Declare the return variable here    DECLARE <@ResultVar, sysname, @Result> <Function_Data_Type, ,int>    -- 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>
CREATE FUNCTION GetSum(    @firstNum int,    @secondNum int)RETURNS intASBEGIN    -- 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

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

CREATE FUNCTION GetSum(    @firstNum int,    @secondNum int)

如果沒有參數,則只要保留括弧即可。跟我們理解的函數寫法一致。

CREATE FUNCTION GetSum()

對於返回方式,這跟我們編程的方式又不大一樣。SQL Server函數的傳回型別並不放在函數名前面,而是函數名括弧的後面。而且函數的傳回型別需要用到返回關鍵字RETURNS,而不是RETURN

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

ASBEGIN    -- 函數體END

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

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

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

select [dbo].[GetSum]()

相對於純量涵式只返回一個標量值,內聯資料表值函式返回的是表資料。當然羅,表資料就是Table類型。

寫法如下:

CREATE FUNCTION <Inline_Function_Name, sysname, FunctionName> (        -- Add the parameters for the function here    <@param1, sysname, @p1> <Data_Type_For_Param1, , int>,     <@param2, sysname, @p2> <Data_Type_For_Param2, , char>)RETURNS TABLE ASRETURN (    -- Add the SELECT statement with parameter references here    SELECT 0)GO
CREATE FUNCTION [GetMoreThanSalary](        @salary int)RETURNS TABLE ASRETURN (    SELECT [FName],[FCity],[FAge],[FSalary] FROM [Demo].[dbo].[T_Person] Where [FSalary] > @salary)

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

對於純量涵式來講,函數體是包含在如下結構中。

ASBEGIN    -- 函數體END

但是對於內聯資料表值函式來講,函數體的結構則是如下的方式。內聯資料表值函式只執行一條SQL語句後返回Table結果。

ASRETURN    -- 函數體END

執行資料表值函式的方式如下:

select [FName],[FCity],[FAge],[FSalary] from [dbo].[GetMoreThanSalary](8000)

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

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

CREATE FUNCTION <Table_Function_Name, sysname, FunctionName> (    -- Add the parameters for the function here    <@param1, sysname, @p1> <data_type_for_param1, , int>,     <@param2, sysname, @p2> <data_type_for_param2, , char>)RETURNS <@Table_Variable_Name, sysname, @Table_Var> TABLE (    -- Add the column definitions for the TABLE variable here    <Column_1, sysname, c1> <Data_Type_For_Column1, , int>,     <Column_2, sysname, c2> <Data_Type_For_Column2, , int>)ASBEGIN    -- Fill the table variable with the rows for your result set        RETURN ENDGO
ALTER FUNCTION DemoFun()RETURNS @result TABLE (    name nvarchar(20),    city nvarchar(20),    age int,    salary int)ASBEGIN    -- 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    ('測試','China', 1, 0)    RETURN ENDGO

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

RETURNS <@Table_Variable_Name, sysname, @Table_Var> TABLE (    -- Add the column definitions for the TABLE variable here    <Column_1, sysname, c1> <Data_Type_For_Column1, , int>,     <Column_2, sysname, c2> <Data_Type_For_Column2, , int>)

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.