프로그래밍/MS-SQL

구분자로 분리된 값을 여러레코드로 반환

손반장님 2010. 3. 26. 15:18

일반적인 SQL 내장 함수로는 처리가 불가능 하지만

MSSQL 2005 부터는

아래와 같은 사용자정의함수를 통해 결과를 얻을 수 있습니다


USE TEMPDB
GO
CREATE TABLE TEST(A INT, B VARCHAR(10))

GO

INSERT TEST VALUES(1,'1')
INSERT TEST VALUES(1,'1,2')
INSERT TEST VALUES(1,'1,2,3')
INSERT TEST VALUES(1,'1,2,3,4')

GO


CREATE FUNCTION DBO.UFN_SPLIT
(
@TEXT VARCHAR(1000)
,@COMMA CHAR(1)
)
RETURNS @T TABLE ( NUM INT)
AS
BEGIN
DECLARE @NUM INT
IF @TEXT IS NULL OR @TEXT = ''
    RETURN

IF CHARINDEX(@COMMA,@TEXT) = 0
          INSERT @T VALUES(CONVERT(INT,@TEXT))
ELSE
BEGIN
     SET @NUM = 0
     WHILE CHARINDEX(@COMMA,@TEXT) >= 0
     BEGIN
              IF CHARINDEX(@COMMA,@TEXT) = 0
              BEGIN
                    INSERT @T VALUES(CONVERT(INT,@TEXT))
                    RETURN
              END
              ELSE
              BEGIN
              SET @NUM = CONVERT(INT, SUBSTRING(@TEXT,1,CHARINDEX(@COMMA,@TEXT)-1))
              INSERT @T VALUES (@NUM)
              SET @TEXT = SUBSTRING(@TEXT
,CHARINDEX(@COMMA,@TEXT)+1
,LEN(@TEXT)-CHARINDEX(@COMMA,@TEXT))
              END
     END
END
RETURN
END

GO


SELECT TEST.A, B.NUM FROM TEST
              CROSS APPLY DBO.UFN_SPLIT(TEST.B,',') B