허당 레몬도리

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

결과

 

 

 

 

 

출처 : http://withsoju.tistory.com/599

profile

허당 레몬도리

@LemonDory

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!