首頁  >  文章  >  後端開發  >  php:SQL Server使用者自訂的函數種類詳解

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

伊谢尔伦
伊谢尔伦原創
2017-06-26 09:16:541859瀏覽

關於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>
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>
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

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

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

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

CREATE FUNCTION GetSum
(
)

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

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

AS
BEGIN
    -- 函数体
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 
AS
RETURN 
(
    -- Add the SELECT statement with parameter references here
    SELECT 0
)
GO
CREATE FUNCTION [GetMoreThanSalary]
(    
    @salary int
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT [FName],[FCity],[FAge],[FSalary] FROM [Demo].[dbo].[T_Person] Where [FSalary] > @salary
)

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

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

AS
BEGIN
    -- 函数体
END

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

AS
RETURN
    -- 函数体
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>
)
AS
BEGIN
    -- Fill the table variable with the rows for your result set
    
    RETURN 
END
GO
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
    (&#39;测试&#39;,&#39;China&#39;, 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>
)

内容倒是不多,但是要熟练使用的话,还是需要在项目中多加使用才行。网上有一些网友总结出来的常用自定义函数大家可以收集积累,就像做项目一样,好的方法要形成所谓的开发库,帮助我们在下一个项目中复用。节省我们的开发时间,提高我们的工作效率。

以上是php:SQL Server使用者自訂的函數種類詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn