반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- javascript
- spring
- Tomcat Error
- .NET Core Proxy
- Nginx Reverse Proxy
- 웹 자동화
- Visual Studio 2015 설치
- Visual Studio 패키지에 실패했습니다.
- Vue configureWebpack
- MSSQL 문자열
- Visual Studio 재설치
- MSSQL 동적 쿼리
- vue
- Visual Studio 2015 강제 삭제
- .NET Core
- vue3
- Visual Studio 강제 삭제
- Selenium 설치
- 디자인 패턴 사례
- Selenium 환경
- Vue3 configureWebpack
- SQLP
- 업무 자동화
- 웹 크롤링
- vue.js
- Visual Studio 2015 삭제
- Vue.config
- 리버스 프록시 예제
- tomcat
- 프록시 예제
Archives
- Today
- Total
금백조의 개발 블로그
[MSSQL]스칼라 함수 정의 및 예제(Scalar Function) 본문
반응형
서론
회사에서 같이 일을 하는 동료가 갑자기 저에게 퀴즈?를 주었습니다. 퀴즈의 내용은 아래와 같습니다.
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(사용자 정의 함수)로 인한 성능저하 ①]
[스칼라 사용자 정의 함수를 더 빠르게 동작하도록 하는 방법]
반응형
'Database > SQL Server(MSSQL)' 카테고리의 다른 글
[MSSQL]SSMS에서 쿼리 바로 가기 설정하기(SQL Server Management Studio) (0) | 2021.05.07 |
---|---|
[MSSQL][SQLP]MERGE문을 사용하여 INSERT, UPDATE 한번에 처리(DML 튜닝) (0) | 2021.04.21 |
[MSSQL]CROSS APPLY, OUTER APPLY 활용 및 예제(APPLY 연산자) (6) | 2021.03.31 |
[MSSQL]EXCEPT를 이용한 차집합 구하기(MSSQL 차집합) (0) | 2021.03.30 |
[MSSQL]SELECT, WHERE, ORDER BY절에서 CASE문 활용하기(SELECT CASE, WHERE CASE, ORDER BY CASE) (0) | 2021.03.28 |