인라인 사용자 정의 함수

인라인 사용자 정의 함수는 table 데이터 형식을 반환하는 사용자 정의 함수의 하위 집합입니다. 인라인 함수를 사용하면 매개 변수가 있는 뷰의 기능을 수행할 수 있습니다.

다음 예는 지정한 지역에 대해 상점 이름 및 도시를 반환합니다.

USE AdventureWorks;
GO
CREATE VIEW CustomersByRegion
AS
SELECT DISTINCT S.Name AS Store, A.City
FROM Sales.Store AS S
    JOIN Sales.CustomerAddress AS CA ON CA.CustomerID = S.CustomerID
    JOIN Person.Address AS A ON A.AddressID = CA.AddressID
    JOIN Person.StateProvince SP ON 
        SP.StateProvinceID = A.StateProvinceID
WHERE SP.Name = N'Washington';
GO

좀 더 일반화하여 사용자가 보고 싶은 지역을 지정할 수 있다면 이 뷰가 보다 유용해집니다. 그러나 뷰는 WHERE 절에 지정된 검색 조건에서 매개 변수를 지원하지 않습니다. 인라인 사용자 정의 함수를 사용하면 WHERE 절에 지정된 검색 조건에서 매개 변수가 지원됩니다. 다음 예는 사용자가 쿼리에서 지역을 지정할 수 있도록 하는 인라인 함수를 만듭니다.

USE AdventureWorks;
GO
IF OBJECT_ID(N'Sales.ufn_CustomerNamesInRegion', N'IF') IS NOT NULL
    DROP FUNCTION Sales.ufn_CustomerNamesInRegion;
GO
CREATE FUNCTION Sales.ufn_CustomerNamesInRegion
                 ( @Region nvarchar(50) )
RETURNS table
AS
RETURN (
        SELECT DISTINCT S.Name AS Store, A.City
        FROM Sales.Store AS S
        JOIN Sales.CustomerAddress AS CA ON CA.CustomerID = S.CustomerID
        JOIN Person.Address AS A ON A.AddressID = CA.AddressID
        JOIN Person.StateProvince SP ON 
        SP.StateProvinceID = A.StateProvinceID
        WHERE SP.Name = @Region
       );
GO
-- Example of calling the function for a specific region
SELECT *
FROM Sales.ufn_CustomerNamesInRegion(N'Washington');
GO

인라인 사용자 정의 함수 규칙

인라인 사용자 정의 함수는 다음 규칙을 따릅니다.

  • RETURNS 절에는 table 키워드만 포함됩니다. 반환 변수 형식은 RETURN 절에 있는 SELECT 문의 결과 집합 형식으로 설정되므로 사용자가 정의하지 않아도 됩니다.

  • BEGIN과 END로 구분되는 function_body는 없습니다.

  • RETURN 절에는 하나의 SELECT 문이 괄호 안에 포함됩니다. 함수에서 반환하는 테이블은 SELECT 문의 결과 집합으로 구성됩니다. 인라인 함수에서 사용되는 SELECT 문은 뷰에서 사용되는 SELECT 문과 같은 제한을 받습니다.

  • 테이블 반환 함수는 상수 또는 @local_variable 인수만 허용합니다.

인라인 함수 및 인덱싱된 뷰

또한 인라인 함수는 인덱싱된 뷰의 성능을 증대하는 데 사용할 수 있습니다. 인덱싱된 뷰 자체는 WHERE 절 검색 조건에서 매개 변수를 사용하여 특정 사용자의 저장된 결과 집합을 변경할 수 없습니다. 그러나 뷰와 일치하는 전체 데이터 집합을 저장하는 인덱싱된 뷰를 정의한 다음 인덱싱된 뷰에 사용자가 결과를 변경할 수 있는 매개 변수가 있는 검색 조건이 포함된 인라인 함수를 정의할 수 있습니다. 뷰 정의가 복잡할 경우 결과 집합을 작성하기 위해 수행되는 대부분의 작업은 클러스터형 인덱스가 뷰에 생성될 때 집계 작성이나 여러 테이블 조인 등과 같은 작업입니다. 그런 다음 인덱싱된 뷰를 참조하는 인라인 함수를 만들면 이 함수가 사용자의 매개 변수가 있는 필터를 적용하여 인덱싱된 뷰의 구체화된 결과 집합에서 특정 행을 반환할 수 있습니다. 예를 들면 다음과 같습니다.

  1. 모든 상점에 대해 분기별로 요약된 판매 데이터를 보고하는 결과 집합으로 모든 판매 데이터를 집계하는 vw_QuarterlySales 뷰를 정의합니다.

  2. vw_QuarterlySales 뷰에 클러스터형 인덱스를 만들어 요약된 데이터를 포함하는 결과 집합을 구체화합니다.

  3. 인라인 함수를 만들어 요약된 데이터를 필터링합니다.

    CREATE FUNCTION dbo.ufn_QuarterlySalesByStore
         ( @StoreID int )
    RETURNS table
    AS
    RETURN (
            SELECT *
            FROM SalesDB.dbo.vw_QuarterlySales
            WHERE StoreID = @StoreID
           )
    
  4. 그런 다음 사용자가 인라인 함수에서 특정 상점에 대한 데이터를 선택하여 가져올 수 있습니다.

    SELECT *
    FROM fn_QuarterlySalesByStore(14432)
    

4단계에서 제시된 쿼리를 실행하는 데 필요한 대부분의 작업은 분기별로 판매 데이터를 집계하는 것입니다. 이 작업은 2단계에서 한 번 수행됩니다. 4단계에서 각 SELECT 문은 fn_QuarterlySalesByStore 함수를 사용하여 상점별로 집계된 데이터를 필터링합니다.