USER DEFINED FUNCTION


◎ 建立一個 FUNCTION

CREATE FUNCTION fnTest()--括號內可以接收多個參數
RETURNS INT--一個FUNCTION只能回傳一個參數,型態可以是INT、VARCHAR、DATETIME...等等,更強的是可以回傳一個TABLE(Inline Table Valued Function, ITVF)
WITH SchemaBinding--一般建議加這一行,以防SELECT的TABLE被刪除,但TABLE前面一定要加SchemaName
AS
BEGIN
    DECLARE @count INT;
    SELECT @count = COUNT(*)
    FROM dbo.Employees
    RETURN @count;

    --也可以這樣寫
    --RETURN
    --(
    --    SELECT COUNT(*)
    --    FROM dbo.Employees
    --)
END

--呼叫FUNCTION
--前面一定要加SchemaName,通常SchemaName是dbo
SELECT [dbo].[fnTest]()--如果Function有定義接收的參數,括號內要傳對應的參數進去

◎ 建立一個可以回傳一個TABLE的FUNCTION

方法一:

--注意:帶入的參數要設定長度,若沒有設定長度,預設長度為1,如果執行SP的時候帶入的參數長度超過1,SSMS只會截取第一碼當參數帶入,帶入的參數設定長度時候可以超過WHERE欄位的長度沒關係
CREATE FUNCTION fnTest( @PARA1 NVARCHAR(30))--括號內可以接收多個參數
RETURNS TABLE--注意這裡是帶TABLE
WITH SchemaBinding--一般建議加這一行,以防SELECT的TABLE被刪除,但TABLE前面一定要加SchemaName
AS
RETURN
(
    SELECT *
    FROM dbo.Employees
    WHERE TitleOfCourtesy = @PARA1
)

方法二:

CREATE FUNCTION fnTEST()
RETURNS @Cacl TABLE
(
    Column_1 NVARCHAR(MAX),
    Column_2 NVARCHAR(MAX)
)
BEGIN

    INSERT @Cacl
    SELECT *
    FROM [OTHER_TABLE]

    RETURN;
END
--呼叫可以回傳TABLE的FUNCTION
SELECT *
FROM dbo.fnTest('Ms.')

◎ 撈取DataBase中所有的 FUNCTION (找Stored Procedure也適用)

SELECT *
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = 'FUNCTION'

◎ Stored Procedure 跟 FUNCTION 的差別

1.FUNCTION 可以用在 SELECT 裡面,而 Stored Procedure 不可以

例如:SELECT sp_City <-- 這是錯的
EXEC sp_City <-- 這是對的
2.如果FUNCTION回傳的是一個TABLE(Inline Table Valued Function, ITVF),則還可以JOIN其他TABLE

results matching ""

    No results matching ""