SQL Server用戶自定義函數

前幾篇博文介紹了很多SQL Server系統自帶函數方面的使用方法,此次將學習SQL Sever用戶自定義函數的使用方法,算是對SQL Server函數的補充。但願與園裏的朋友共同窗習並取經。數據庫

關於SQL Server用戶自定義的函數,有標量函數、表值函數(內聯表值函數、多語句表值函數)兩種。編程

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

 

標量函數

 

所謂標量函數簡單點來說就是返回的結果只是一個標量,對於我來說,返回的結果就是一種類型的一個值。工具

寫法以下:學習

-- =============================================
-- Author:        <Author,,Name>
-- Create date: <Create Date, ,>
-- Description:    <Description, ,>
-- =============================================
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>
AS
BEGIN
    -- 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>

END

例子:測試

-- =============================================
-- Author:        <Author,,Name>
-- Create date: <Create Date, ,>
-- Description:    <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

 題外話:咱們來看看上面的寫法,對於SQL Server來說,咱們聲明一個變量的方式是用@變量名,並且相對於編程來說,SQL Server聲明的方式跟咱們開了個玩笑,是先變量後面纔是類型。對於須要傳參跟不須要傳參的方式,其實跟咱們編程的方式同樣。有參數則是以下方式:spa

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

若是沒有參數,則只要保留括號便可。跟咱們理解的函數寫法一致。code

CREATE FUNCTION GetSum
(
)

對於返回方式,這跟咱們編程的方式又不大同樣。SQL Server函數的返回類型並不放在函數名前面,而是函數名括號的後面。並且函數的返回類型須要用到返回關鍵字RETURNS,而不是RETURN對象

對於函數來說,固然也會有所謂的函數體。標量函數也同樣。它的函數體是包含在:blog

AS
BEGIN
    -- 函數體
END

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

好了,標量函數的例子也舉完了,要存到數據庫裏面,還須要點擊Microsoft SQL Server Management Studio工具裏的執行操做。這樣以後,就能夠在查詢窗口裏面跟查詢表數據同樣來查詢結果了。

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

select [dbo].[GetSum]()

 

內聯表值函數

 

 相對於標量函數只返回一個標量值,內聯表值函數返回的是表數據。固然羅,表數據就是Table類型。

寫法以下:

-- =============================================
-- Author:        <Author,,Name>
-- Create date: <Create Date,,>
-- Description:    <Description,,>
-- =============================================
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 
AS
RETURN 
(
    -- Add the SELECT statement with parameter references here
    SELECT 0
)
GO

例子:

-- =============================================
-- Author:        <Author,,Name>
-- Create date: <Create Date,,>
-- Description:    <Description,,>
-- =============================================
CREATE FUNCTION [GetMoreThanSalary]
(    
    @salary int
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT [FName],[FCity],[FAge],[FSalary] FROM [Demo].[dbo].[T_Person] Where [FSalary] > @salary
)
GO

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

對於標量函數來說,函數體是包含在以下結構中。

AS
BEGIN
    -- 函數體
END

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

AS
RETURN
    -- 函數體
END

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

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

能夠看得出,這種執行方式就跟普通表的執行方式同樣了。表值函數其實至關於存儲在內存空間裏面的一張虛擬表。

 

多語句表值函數

 

 多語句表值函數跟內聯表值函數都是表值函數,它們返回的結果都是Table類型。多語句表值函數顧名思義,就是能夠經過多條語句來建立Table類型的數據。這裏不一樣於內聯表值函數,內聯表值函數的返回結果是由函數體內的SELECT語句來決定。而多語句表值函數,則是須要指定具體的Table類型的結構。也就是說返回的Table,已經定義好要哪些字段返回。因此它可以支持多條語句的執行來建立Table數據。

寫法以下:

-- =============================================
-- Author:        <Author,,Name>
-- Create date: <Create Date,,>
-- Description:    <Description,,>
-- =============================================
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>
)
AS
BEGIN
    -- Fill the table variable with the rows for your result set
    
    RETURN 
END
GO

例子:

-- =============================================
-- Author:        <Author,,Name>
-- Create date: <Create Date,,>
-- Description:    <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
    ('測試','China', 1, 0)
    RETURN 
END
GO

題外話:能夠看得出,多語句表值函數的返回結果是定義好表結構的虛擬表。這又跟標量函數同樣了吧,只不過標量函數是返回一種類型的標量值而已。並且在多語句表值函數裏面,你也會發現最後一句是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>
)

內容卻是很少,可是要熟練使用的話,仍是須要在項目中多加使用才行。網上有一些網友總結出來的經常使用自定義函數你們能夠收集積累,就像作項目同樣,好的方法要造成所謂的開發庫,幫助咱們在下一個項目中複用。節省咱們的開發時間,提升咱們的工做效率。

至此,本文完。

相關文章
相關標籤/搜索