MSSQL 스칼라 함수 정의 및 사용법(+테이블 반환함수)

 

MSSQL 함수는 크게 스칼라 반환 함수, 인라인 테이블 반환 함수, 다중문장 테이블 반환 함수로 구분이 된다. 3가지의 차이점을 표로 만들어 봤다.

간략 요약을 하자면 함수의 반환값에 따라 구분한다고 보면 된다. 


1. 스칼라 반환 함수

하나의 값만 반환합니다.


1. GetAge함수를 생성한다.

CREATE FUNCTION dbo.fn_GetAge
(
    @BirthYear INT
)
RETURNS INT
AS
BEGIN
    RETURN YEAR(GETDATE()) - @BirthYear
END

2. GetAge 함수 사용

SELECT dbo.fn_GetAge(1990)

또는 SELECT절에 같이 사용해도 된다.

SELECT
Name,
dbo.fn_GetAge(BirthYear) AS Age
FROM Member

3. 결과 : 36  -> 하나의 값을 반환하는 것이 스칼라 함수이다.

4. 특징
반환형이 INT, VARCHAR, DATETIME 등 단일 데이터형이고 주로 계산용으로 많이 사용을 한다.
특히 주의해야될점은 행마다 함수가 호출되므로 대량 데이터에서 성능 저하 발생할수 있으므로 데이터양을 확인하고, 추후 데이터가 많아질수있는 부분은 검토가 필요하다.


2. 인라인 테이블 반환 함수

SELECT 결과 자체를 테이블로 반환합니다.


1. 함수를 생성한다.
CREATE FUNCTION dbo.fn_GetMember
(
@Grade CHAR(1)
)
RETURNS TABLE
AS
RETURN
(
SELECT
MemberID,
Name,
Grade
FROM Member
WHERE Grade = @Grade
)

2. 사용

SELECT *
FROM dbo.fn_GetMember('A')

3. 결과

MemberID Name Grade
--------         -----    -----
1                 Kim     A
3                 Lee      A

4. 특징
* BEGIN~END 없으며 RETURN 뒤에 SELECT 한 개만 작성할수 있다.
* 뷰(View)에 파라미터를 추가한 것과 비슷
* SQL 옵티마이저가 쿼리와 통합 최적화 가능하며 성능이 가장 우수

실제로 실무에서는 가능하면 이 방식을 가장 많이 사용하고 있다.


3. 다중문장 테이블 반환 함수

여러 SQL 문을 사용하여 테이블을 만들어 반환합니다.


1.함수 생성

CREATE FUNCTION dbo.fn_GetSalesSummary
(
@Year INT
)
RETURNS @Result TABLE
(
ProductID INT,
TotalSales MONEY
)
AS
BEGIN

INSERT INTO @Result
SELECT
ProductID,
SUM(Amount)
FROM Sales
WHERE YEAR(OrderDate) = @Year
GROUP BY ProductID

RETURN
END

2. 실행

SELECT *
FROM dbo.fn_GetSalesSummary(2025)

3. 특징

BEGIN~END 사용하며, 여러 SQL 문 사용 가능하다. 그리고 IF, WHILE문도 사용 가능하며 중간 결과에 대한 값을 가공할수 있다.
속도적인 측면에서는 내부적으로 테이블 변수를 사용하므로 성능이 떨어질 수 있다.


실무에서는 "가능하면 인라인 테이블 반환 함수를 사용하고, 정말 필요한 경우에만 다중문장 테이블 반환 함수를 사용한다"고 생각하시면 됩니다. 
성능 차이가 생각보다 크게 발생하는 경우가 많기 때문입니다.

Comment

다음 이전