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, 특정 사용자)
'프로그래밍&IT > SQL Server (MS-SQL)' 카테고리의 다른 글
| MS Sql Server - Stored Procedures (스토어드 프로시저) (4) | 2025.07.30 |
|---|---|
| MS Sql Server - cursor (1) | 2025.07.28 |
| MS Sql Server - 인덱스 (5) | 2025.07.27 |
| MSSQL의 조회데이터를 csv로 만들기 (2) | 2024.09.06 |
| SQL Server - 테이블 수정 저장시 '테이블을 다시 만들어야 하는 변경 내용 저장 사용 안 함' 옵션 (0) | 2024.03.17 |