인라인 사용자 정의 함수
인라인 사용자 정의 함수는 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 절 검색 조건에서 매개 변수를 사용하여 특정 사용자의 저장된 결과 집합을 변경할 수 없습니다. 그러나 뷰와 일치하는 전체 데이터 집합을 저장하는 인덱싱된 뷰를 정의한 다음 인덱싱된 뷰에 사용자가 결과를 변경할 수 있는 매개 변수가 있는 검색 조건이 포함된 인라인 함수를 정의할 수 있습니다. 뷰 정의가 복잡할 경우 결과 집합을 작성하기 위해 수행되는 대부분의 작업은 클러스터형 인덱스가 뷰에 생성될 때 집계 작성이나 여러 테이블 조인 등과 같은 작업입니다. 그런 다음 인덱싱된 뷰를 참조하는 인라인 함수를 만들면 이 함수가 사용자의 매개 변수가 있는 필터를 적용하여 인덱싱된 뷰의 구체화된 결과 집합에서 특정 행을 반환할 수 있습니다. 예를 들면 다음과 같습니다.
모든 상점에 대해 분기별로 요약된 판매 데이터를 보고하는 결과 집합으로 모든 판매 데이터를 집계하는 vw_QuarterlySales 뷰를 정의합니다.
vw_QuarterlySales 뷰에 클러스터형 인덱스를 만들어 요약된 데이터를 포함하는 결과 집합을 구체화합니다.
인라인 함수를 만들어 요약된 데이터를 필터링합니다.
CREATE FUNCTION dbo.ufn_QuarterlySalesByStore ( @StoreID int ) RETURNS table AS RETURN ( SELECT * FROM SalesDB.dbo.vw_QuarterlySales WHERE StoreID = @StoreID )
그런 다음 사용자가 인라인 함수에서 특정 상점에 대한 데이터를 선택하여 가져올 수 있습니다.
SELECT * FROM fn_QuarterlySalesByStore(14432)
4단계에서 제시된 쿼리를 실행하는 데 필요한 대부분의 작업은 분기별로 판매 데이터를 집계하는 것입니다. 이 작업은 2단계에서 한 번 수행됩니다. 4단계에서 각 SELECT 문은 fn_QuarterlySalesByStore 함수를 사용하여 상점별로 집계된 데이터를 필터링합니다.