CHARINDEX 함수를 이용하여, 문자열을 쪼개어 테이블에 넣어 리턴하는 테이블리턴함수 입니다.
여러 번 작성했었는데, 간만에 그냥 테스트 해 보며 머릿속에서 나오는 대로 코딩해 보았습니다.
넘겨지는 원문은 긴 데이터도 받아들일 수 있도록 NTEXT를 받을 수 있게 구현 되어 있습니다.
해당 테이블 리턴 함수를 이용하여 alias를 주고, 다른 테이블과 JOIN 하며 처리하면 활용도가 높겠죠. ㅎ
NTEXT 데이터 타입도,
SUBSTRING 과 CHARINDEX 라는 훌륭한 문자열 함수를 적용시킬 수 있다는 좋은 예제라고 생각 됩니다.
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44 |
CREATE FUNCTION TF_SPLIT ( @ORG_STR NTEXT, -- 쪼갤 원문 @SPLITTER NVARCHAR(1) -- 쪼갤 문자열 ) RETURNS @TBL_SPLIT TABLE ( VAL NVARCHAR(4000) -- 쪼갠 데이터가 들어갈 테이블(길이 확인) ) AS BEGIN -- 원문이 빈 문자열이면 그대로 리턴 IF ISNULL (DATALENGTH(@ORG_STR), 0) = 0 GOTO FUNC_RET; -- 변수 선언 DECLARE @START INT , @FOUND INT ; -- 변수 초기화 SET @START = 1; SET @FOUND = CHARINDEX(@SPLITTER, @ORG_STR, @START + 1); -- @SPLITTER 가 존재하는 경우에만 LOOP WHILE @FOUND > @START BEGIN -- @SPLITTER 로 쪼갠 문자열을 리턴 테이블에 INSERT INSERT INTO @TBL_SPLIT ( VAL ) VALUES ( SUBSTRING (@ORG_STR, @START, @FOUND - @START) ); -- 다음 @SPLITTER 찾음 SET @START = @FOUND + 1; SET @FOUND = CHARINDEX(@SPLITTER, @ORG_STR, @START); END ; FUNC_RET: RETURN ; END GO -- 테스트 SELECT * FROM TF_SPLIT ( N '김구라&윤종신&김국진&규현&' , N '&' ); GO |
결과