본문 바로가기
프로그래밍&IT/SQL Server (MS-SQL)

MS Sql Server - User Defined Functions (UDF)

by 성장의 용 2025. 7. 29.
728x90
반응형

함수 - User Defined Functions (UDF)

- 사용자 정의 함수(User Defined Function, UDF)는 T-SQL에서 직접 만든 함수로, 입력값을 받아 하나의 결과값을 반환

- SQL 문에서 호출 가능하고, 재사용, 모듈화, 가독성 향상 등의 장점이 있다.

 

UDF의 종류

종류 설명 반환값
Scalar Function 하나의 값 반환 int, varchar, datetime 등 스칼라 값
Inline Table-Valued Function 단일 SELECT문 기반 테이블 반환 테이블 (inlined)
Multi-statement
Table-Valued Function
복수 문장을 사용하여 테이블 반환 테이블 (구조 정의 후 조작 가능)

 

Scalar function 예시

CREATE FUNCTION dbo.fn_GetYear (@dateValue DATETIME)
RETURNS INT
AS
BEGIN
    RETURN YEAR(@dateValue)
END

SELECT dbo.fn_GetYear('2025-07-29')

 

Inline Table-Valued Function 예시

CREATE FUNCTION dbo.fn_OrdersByCustomer (@CustomerID NVARCHAR(5))
RETURNS TABLE
AS
RETURN (
    SELECT OrderID, OrderDate
    FROM Orders
    WHERE CustomerID = @CustomerID
)

SELECT * FROM dbo.fn_OrdersByCustomer('ALFKI')

 

Multi-statement Table-Valued Function

CREATE FUNCTION dbo.fn_SplitString (
    @input NVARCHAR(MAX),
    @delimiter CHAR(1)
)
RETURNS @result TABLE (Value NVARCHAR(100))
AS
BEGIN
    DECLARE @start INT = 1, @end INT

    WHILE CHARINDEX(@delimiter, @input, @start) > 0
    BEGIN
        SET @end = CHARINDEX(@delimiter, @input, @start)
        INSERT INTO @result (Value)
        VALUES (SUBSTRING(@input, @start, @end - @start))
        SET @start = @end + 1
    END

    INSERT INTO @result (Value)
    VALUES (SUBSTRING(@input, @start, LEN(@input)))

    RETURN
END

SELECT * FROM dbo.fn_SplitString('Apple,Banana,Cherry', ',')

 

UDF의 주의사항 및 제한 사항

 

  • 함수 내에서 UPDATE, INSERT, DELETE, MERGE 불가 (비결정적 연산 금지)
  • 트랜잭션 관리 불가
  • NEWID(), GETDATE() 등의 비결정적 함수는 사용 제한 (제한 완화되었을 수 있음)
  • 함수는 스칼라보다 테이블 반환이 성능에 더 유리할 수 있음 (특히 Inline TVF)

성능 주의사항

 

  • 스칼라 함수는 특히 JOIN이나 WHERE 절에서 성능 저하를 유발할 수 있음.
  • Inline TVF는 SQL 옵티마이저가 쿼리에 "inline"해서 실행하므로 성능에 더 유리함.

 

 

주요 옵션

1. WITH ENCRYPTION

  • 함수의 소스코드를 암호화해서 외부에서 볼 수 없도록 함.
  • 시스템 뷰 sys.sql_modules, OBJECT_DEFINITION() 함수 등으로 코드 확인 불가능
  • 한 번 암호화되면 원본 코드를 다시 확인할 수 없다.
  • 반드시 버전 관리 시스템이나 외부파일에 소스코드를 따로 저장해두어야 한다.
CREATE FUNCTION dbo.fn_EncryptedFunction (@val INT)
RETURNS INT
WITH ENCRYPTION
AS
BEGIN
    RETURN @val * 2
END

2. WITH SCHEMABINDING

 

  • 해당 함수가 사용하는 테이블/뷰의 구조가 변경되지 않도록 고정.
  • 즉, 함수에서 참조한 테이블이나 뷰에 ALTER / DROP이 불가능해짐.
  • 인덱싱된 뷰계산된 컬럼에서 UDF를 사용할 때 필수

 

3. RETURNS NULL ON NULL INPUT

 

  • 력값이 NULL일 경우, 함수 내부 로직을 실행하지 않고 자동으로 NULL 반환.
  • 기본값은 CALLED ON NULL INPUT (입력이 NULL이어도 내부 실행)

4. EXECUTE AS

 

  • 해당 함수를 호출할 때 사용할 권한 컨텍스트를 지정.
  • 주로 보안 제어 시 사용 (CALLER, SELF, OWNER, 특정 사용자)