금백조의 개발 블로그

[MSSQL]스칼라 함수 정의 및 예제(Scalar Function) 본문

Database/SQL Server(MSSQL)

[MSSQL]스칼라 함수 정의 및 예제(Scalar Function)

금백조 2021. 4. 18. 13:40
반응형

서론

 

회사에서 같이 일을 하는 동료가 갑자기 저에게 퀴즈?를 주었습니다. 퀴즈의 내용은 아래와 같습니다.

 

Q. SQL을 통해 조회하는 문자열의 각 한 글자 사이에 공백을 추가하여 조회하는 방법을 구현하시오.

 

예를 들어 'ALICE'라는 사원 이름 데이터를 'A L I C E'로 조회해야 했습니다. 저는 스칼라 사용자 정의 함수를 사용하여 기능을 구현했습니다. 이 과정 속에서 알게 된 스칼라 사용자 함수의 정의와 사용법에 대해 다뤄보겠습니다.

 


 

본론

 

[정의]

 

스칼라 함수 : 단일 값을 반환하는 함수입니다.

 

[구문 형식]

 

CREATE FUNCTION [dbo].[함수명](@INPUT1 [데이터타입], @INPUT2 [데이터타입]...)
RETURNS [반환 데이터타입]
AS
BEGIN

함수 로직 구현...

END
RETURN [반환 데이터]

 

[장점]

 

  • 반복적으로 사용하는 기능을 캡슐화하여 여러 곳에서 재사용할 수 있습니다.

[단점]

 

  • 한 행씩 처리하므로 대용량 데이터일 경우 스칼라 함수에 의해 성능 저하를 일으킬 수 있습니다.

예제

 

[테스트 데이터 생성]

 

CREATE TABLE EMP(
	EMP_NO INT IDENTITY(1,1) PRIMARY KEY,
	EMP_NM NVARCHAR(10)
)


INSERT INTO EMP SELECT 'ALICE'
INSERT INTO EMP SELECT 'GOLDSWAN'
INSERT INTO EMP SELECT 'BOB'
INSERT INTO EMP SELECT 'SAM'
INSERT INTO EMP SELECT 'TOM'
INSERT INTO EMP SELECT 'JACK'

--데이터 확인
SELECT * FROM EMP

 

[스칼라 사용자 정의 함수 구현]

 

CREATE FUNCTION [dbo].[UFN_ADD_EMPTY_TO_CHAR_BY_SCALAR](@STR NVARCHAR(10))--INPUT 데이터 작성
RETURNS NVARCHAR(20)--RETURN 데이터 타입 정의
AS
BEGIN
--로직 구현 : LOOP문을 돌려 각 글자 사이에 공백 추가
DECLARE @NUM INT = 1
DECLARE @LEN INT = LEN(@STR)
DECLARE @WORD NVARCHAR(20) = ''--EMP 테이블의 EMP_NM의 MAX 길이가 10이므로 @WORD의 길이를 2배인 20으로 선언
WHILE @LEN>=@NUM
	BEGIN
	SET @WORD = CONCAT(@WORD, SUBSTRING(@STR, @NUM,1), ' ')
	SET @NUM+=1
END

SET @WORD = RTRIM(@WORD)--마지막 문자열의 오른쪽 공백 제거

RETURN @WORD
END

 

[실행 확인]

 

SELECT dbo.UFN_ADD_EMPTY_TO_CHAR_BY_SCALAR(EMP_NM) AS EMP_NM FROM EMP 

 

[실행결과]

 

 

 


 

결론

 

동료가 준 퀴즈 덕분에 스칼라 사용자 정의 함수 사용법에 대해 한번 짚고 넘어가게 된 좋은 계기였습니다. 이번 글에선 스칼라 함수의 정의와 단순한 사용 예제에 대해서만 정리했지만 스칼라 함수에 의해 발생할 수 있는 성능 저하와 관련된 예제와 해법에 대해서도 추후에 올려야겠습니다. 스칼라 함수 성능 저하와 관련된 참고 자료들을 아래 링크에 게시했으니 관심이 있으시면 읽어보시면 좋을 거 같습니다.

 

Reference

 

[UDF(사용자 정의 함수)로 인한 성능저하 ①]

burning-dba.tistory.com/78

 

[스칼라 사용자 정의 함수를 더 빠르게 동작하도록 하는 방법]

purumae.tistory.com/179

반응형