본문 바로가기
Database/MSSQL

MSSQL 사용자 정의 함수(UDF) 생성 및 사용 방법

by yazasus 2025. 5. 28.
728x90

MSSQL 사용자 정의 함수(UDF) 생성 및 사용법 – 스칼라 함수부터 테이블 반환 함수까지

SQL Server에서는 자주 사용하는 로직을 사용자 정의 함수(User-Defined Function, UDF)로 만들어 재사용할 수 있습니다.
복잡한 조건 계산, 포맷 처리, 반복되는 쿼리 등을 간결하게 구현할 수 있는 유용한 기능입니다.

1. 사용자 정의 함수 종류

  • 스칼라 함수: 단일 값을 반환 (예: 숫자, 문자열)
  • 테이블 반환 함수 (TVF)
    • 인라인 TVF: 단일 SELECT 문으로 반환
    • 멀티 스테이트먼트 TVF: BEGIN...END 안에 복수 로직 포함

2. 스칼라 함수 생성 및 사용

▶ 예제: 나이 계산 함수


CREATE FUNCTION dbo.fn_GetAge (@BirthDate DATE)
RETURNS INT
AS
BEGIN
    RETURN DATEDIFF(YEAR, @BirthDate, GETDATE());
END;

▶ 사용 방법


SELECT UserName, dbo.fn_GetAge(BirthDate) AS Age
FROM Users;

→ 사용자의 생년월일을 기준으로 나이를 계산합니다.

3. 인라인 테이블 반환 함수 (Inline Table-Valued Function)

▶ 예제: 특정 금액 이상 주문 조회 함수


CREATE FUNCTION dbo.fn_GetHighOrders (@MinAmount MONEY)
RETURNS TABLE
AS
RETURN (
    SELECT OrderId, UserId, TotalAmount
    FROM Orders
    WHERE TotalAmount >= @MinAmount
);

▶ 사용 방법


SELECT * 
FROM dbo.fn_GetHighOrders(50000);

4. 멀티 스테이트먼트 테이블 반환 함수

▶ 예제: 사용자별 최근 주문


CREATE FUNCTION dbo.fn_LatestOrderPerUser()
RETURNS @Result TABLE (
    UserId INT,
    LastOrderDate DATETIME
)
AS
BEGIN
    INSERT INTO @Result
    SELECT UserId, MAX(OrderDate)
    FROM Orders
    GROUP BY UserId;

    RETURN;
END;

▶ 사용 방법


SELECT * FROM dbo.fn_LatestOrderPerUser();

5. 함수 삭제 및 수정

  • 삭제: DROP FUNCTION dbo.fn_GetAge;
  • 수정: 기존 함수를 변경할 땐 ALTER FUNCTION 사용

6. 실무 팁 💡

  • 스칼라 함수는 행 단위로 호출되므로 대량 데이터에서 성능 저하를 일으킬 수 있습니다.
  • 복잡한 집계나 다중 결과 조회는 인라인 TVF로 처리하는 것이 성능에 유리합니다.
  • 함수 내부에서는 INSERT, UPDATE 등 DML 문장을 사용할 수 없습니다.
  • 테스트 시 함수 결과를 SELECT dbo.함수명(...)으로 바로 확인 가능해 개발이 편리합니다.

마무리

사용자 정의 함수(UDF)는 반복되는 로직을 재사용하고, 쿼리 가독성과 유지보수성을 높이는 데 매우 유용합니다.
특히 조건 계산, 포맷 처리, 필터링 로직을 공통화할 때 효과적이며, 상황에 맞는 함수 유형을 선택하는 것이 중요합니다.

728x90