본문 바로가기

DEV LOGS

[MSSQL] 사용자 정의 함수


사용자 정의 함수란?

- 형태는 저장 프로시저와 비슷해 보이지만, 일반적인 프로그래밍 언어에서 사용되는 함수와 비슷한 개념이다.

- RETURN 문에 의해서 특정 값을 반환하는 기능을 한다.

- 함수를 호출할 때 스키마 이름을 지정하지 않아 디폴트 스키마인 경우에도 'dbo.'을 붙여서 호출해야한다.



사용자 정의 함수의 생성 / 수정 / 삭제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
--Transact-SQL Scalar Function Syntax
CREATE FUNCTION [ schema_name. ] function_name 
( [ { @parameter_name [ AS ][ type_schema_name. ] parameter_data_type 
    [ = default ] [ READONLY ] } 
    [ ,...n ]
  ]
)
RETURNS return_data_type
    [ WITH <function_option> [ ,...n ] ]
    [ AS ]
    BEGIN 
        function_body 
        RETURN scalar_expression
    END
[ ; ]
cs


다양한 사용 예시

(1) 출생년도를 입력하면 나이가 출력되는 함수

- 생성

1
2
3
4
5
6
7
8
9
CREATE FUNCTION ufn_getAge(@byear INT)    -- 매개 변수를 정수로 받음
    RETURNS INT    -- 리턴값은 정수형
AS
    BEGIN
        DECLARE @age INT
        SET @age = YEAR(GETDATE()) - @byear + 1
        RETURN(@age)
    END
GO
cs

- 함수 호출 방법 1 ( SELECT문 사용)

1
SELECT dbo.ufn_getAge(1991);    -- 호출시 스키마명을 붙여줘야 함
cs

- 결과


- 함수 호출 방법 2 ( EXECUTE문 사용 )

1
2
3
DECLARE @retVar INT;
EXEC @retVar = dbo.ufn_getAge 1991;
PRINT @retVar;
cs

- 결과

(2) 함수 수정 (만나이를 출력하도록 수정)

1
2
3
4
5
6
7
8
9
ALTER FUNCTION ufn_getAge(@byear INT)
    RETURNS INT
AS
    BEGIN
        DECLARE @age INT
        SET @age = YEAR(GETDATE()) - @byear
        RETURN(@age)
    END
GO
cs

(3) 함수 삭제

1
DROP FUNCTION ufn_getAge;
cs

사용자 정의 함수의 제약 사항
- 내부에 TRY … CATCH 문을 사용할 수 없다.
- 내부에 CREATE / ALTER / DROP과 같은 DDL을 사용할 수 없다.
- 오류가 발생하면 즉시 함수의 실행이 멈추고 값을 반환하지 않는다.


참고문헌


우재남, 『뇌를 자극하는 SQL Server 2012』 한빛미디어 (2013-03-02 초판발행)