본문 바로가기
Database/MSSQL

T-SQL로 구현한 split 함수

by 반화넬 2007. 7. 24.
반응형
출처 블로그 > WiNMasTeR의 블로그예요. ^^
원본 http://blog.naver.com/jgalgil/120033183983

기능설명

comma (,), semi colon(;) 등으로 구분된 문장을
Row 단위로 분리해서 처리하고자 할 때 사용할 수 있는 Query입니다.
(spilit 함수와 유사한 기능을 가지고 있지요.)

여기서 예로 든 것은 SP로 되어 있지만,
때에 따라서 Function으로 만들어 사용해도 효과적일 것입니다.

Script 내의 다음 구문이 Row 단위로
분리된 data를 처리하는 부분입니다.


print substring(@list, @sp,  @ep-1)

 

이것을 table에 넣는 logic으로 바꿀 수도 있고,
또는 결과물을 union으로 묶어서 RecordSet 형태로
떨어트릴 수 도 있을 것입니다.
 

Parameters 설명
 

1. @list varchar(100)
split하기를 원하는 문장 입력
함수를 사용한다면 컬럼이 될 수 도 있다.
 

2. @delimiter varchar(10)
split할 때 기준으로 삼을 구분자

예: , ; |

 

Script

/*
    작성자 : 한기환
    작성일 : 2005-02-22
    내  용 : 특정 구분자를 가지는 문자열을 Row단위로 분리해서 반환한다.

    사용예 :
        EXEC dbo.usp_SplitByDelimiter @list= '한기환,정원혁,하성희', @delimiter = ','
*/

CREATE PROCEDURE dbo.usp_SplitByDelimiter
    @list varchar(100)
    , @delimiter varchar(10)
AS
set nocount on

declare
--@list varchar(100), @i int
--  , @delimiter varchar(10) -- delimitor
    @len int -- Length of a sentence
    , @ep int -- End Point
    , @sp int -- Start Point
 
--set @delimiter = ','
--set @list= '한기환,정원혁,하성희'
set @len = len(@list)
set @sp = 1
set @ep = 1

-- Data의 마지막을 확인하기 위해서
-- End point는 항상 0보다 커야하고, Start Point는 전체 길이보다 작거나 같아야 한다.
while (@ep > 0 and @sp <= @len)
begin
    set @ep =
        case
            when (charindex(@delimiter, substring(@list, @sp, @len)) = 0)
                then @len + 1
            else
                charindex(@delimiter, substring(@list, @sp, @len))
            end

--  print cast(@list as varchar) +':'+cast(@sp as varchar) +':'+ cast(@ep as varchar)
    print substring(@list, @sp,  @ep-1)
    set @sp = @sp + @ep
end

set nocount off

GO

반응형