본문 바로가기

데이터베이스

Multi-statement table-valued functions in Sql Server

Multi-statement table-valued function(MSTVFs)은 테이블을 반환 값으로 돌려준다. 그리고 이 반환되는 테이블의 구조는 사용자에 의해서 정의가 된다.

 

MSTVFs는 하나 이상의 Statement를 포함할 수 있다. 

 

# MSTVFs Syntax

 

Create Function Multistatement_TableValued_Function_Name 

(

    @param1 DataType,

    @param2 DataType,

    ..............

    @paramN DataType

)

Returns

@OutputTable Table

(

    @Column1 DataTypeForColumn1,

    @Column2 DataTypeForColumn2

As

Begin

    -- Function Body

    return

End

 

# MSTVFs와 inline table-valued function 차이점

1. return table structure를 선언한다.

2. Begin/End 블록을을 시작과 끝에 적는다.

3. 하나 이상의 Statement를 함수 body에 포함시킬 수 있다. 

4. 반드시 Return Operator를 사용해야 한다. 

# MSTVFs와 inline table-valued function Syntax 차이점 

Muti-Statement Tavble-Valued Function Inline Table-Valued Function

Create Function Multistatement_TableValued_Function_Name 

(

    @param1 DataType,

    @param2 DataType,

    ..............

    @paramN DataType

)

Returns

@OutputTable Table

(

    @Column1 DataTypeForColumn1,

    @Column2 DataTypeForColumn2

As

Begin

    -- Function Body

    return

End

Create Function TableValues_Function_Name
(
    @param1 Datatype,
    @param2 Datatype,
    ..............
    @paramN DataType
)
returns
Table 
As
Return
(
    Select Statement
)

# 작성예

CREATE FUNCTION dbo.UdfGetProductsScrapStatus

(

    @ScrapComLevel INT -- 파라메터 선언

)

RETURNS @ResultTable TABLE -- Return 테이블 정의, 이 테이블은 함수 Body안에서 생성되고 업데이트되어 반환됨.  

(

    ProductName VARCHAR(50), -- 테이블 컬럼 열거

    ScrapQty FLOAT,

    ScrapReasonDef VARCHAR(100),

    ScrapStatus VARCHAR(50

) AS BEGIN -- 블록 시작

        INSERT INTO @ResultTable

            SELECT PR.Name, SUM([ScrappedQty]), SC.Name, NULL

                FROM [Production].[WorkOrder] AS WO

                        INNER JOIN

                        Production.Product AS PR

                        ON Pr.ProductID = WO.ProductID

                        INNER JOIN Production.ScrapReason AS SC

                        ON SC.ScrapReasonID = WO.ScrapReasonID

                WHERE WO.ScrapReasonID IS NOT NULL

                GROUP BY PR.Name, SC.Name

UPDATE @ResultTable

            SET ScrapStatus =

            CASE WHEN ScrapQty > @ScrapComLevel THEN 'Critical'

            ELSE 'Normal'

            END

        

RETURN  -- 반드시 Return을 사용해야 Output 테이블(@ResultTable)이 반환됨.

END -- 블록 끝

 

# MSTVFs 실행 

SELECT ProductName AS [Product Name],

          ScrapQty AS [Scrap Quantity] ,

          ScrapReasonDef AS [Scrap Reason],

          ScrapStatus AS [Scrap Status]

FROM dbo.UdfGetProductsScrapStatus(200)

 

위와 같이 단독으로 테이블처럼 사용할 수 있고 또 From Table as A cross apply MSTVFs와 같이 사용할 수도 이다. 

 

# 결론

1. MSTVFs는 retun/output 테이블을 함수 Body내에서 수정 가능하므로 복잡한 결과 셋을 생성할 수 있다.

2. select 문에 사용하거나 다른 테이블들과  join 시켜 사용할 수 있다. 

 

'데이터베이스' 카테고리의 다른 글

SQL Server TRY CATCH  (0) 2020.06.09
Merge  (0) 2020.06.08
클러스터 인덱스, 비 클러스터형인데스 차이  (0) 2020.06.05
스칼라 함수(Scalar Function)  (0) 2020.06.04
테이블 반환 함수(table-valued function)  (0) 2020.06.03