[sql]sql split return table

.Net 2008. 12. 18. 16:31 posted by 무명시인

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


/*********************************************************************************   
함 수 명 : 입력값 구분자 제거후 테이블 반환
함수기능 :
입력변수 : 구분자, 값
리 턴 값 : TABLE
작 성 일 : 2008-11-19
작 성 자 :   
실행예제 : -- select * from  dbo.UFN_SAM_SplitParameter(',','2,3,4')
수 정 일                수정자                수정한 라인 번호 및 수정 사항   

**********************************************************************************/

ALTER FUNCTION [dbo].[UFN_SAM_SplitParameter]
(
 @Separator CHAR(1),
 @List  VARCHAR(MAX)
)
RETURNS @ReturnTable TABLE(Item VARCHAR(1000))
AS
BEGIN
 DECLARE @vIndex  INT;
 DECLARE @vNewText VARCHAR(8000);
 IF @List = null
  RETURN;
 SET @vIndex = CHARINDEX(@Separator, @List);
 WHILE NOT(@vIndex = 0)
 BEGIN
  SET @vNewText = RTRIM(LTRIM(LEFT(@List, @vIndex - 1)));
  SET @List = RIGHT(@List, LEN(@List) - @vIndex);
  INSERT INTO @ReturnTable(Item) VALUES(@vNewText);
  SET @vIndex = CHARINDEX(@Separator, @List);
 END
  
 INSERT INTO @ReturnTable(Item) VALUES(RTRIM(LTRIM(@List)));

 RETURN;
END


set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go




/*==============================================================================
 프로그램ID    : [dbo].[ufn_Split]
 업무명       :
 프로그램명   :
 프로그램설명 : 배열(@String)을넘겨받아구분자(@Separator)를기준으로테이블을생성한다.
 최초작성일   : 2007-01-08
 최초작성자   :
 수정일       :
 수정자       :
 입력값       : 01.  @String
      02.  @Separator
 출력값       : 테이블
 실행예제     : SELECT Pos, Element FROM [dbo].[UFN_SAM_Split]('a,b,c', ',') AS F;
 변경이력     :
 참고사항     :
  =============================================================================*/
ALTER FUNCTION [dbo].[UFN_SAM_Split]
(
   @String  VARCHAR(MAX)
  ,@Separator CHAR(1) = ','
)
RETURNS @SplitTable TABLE
(
 Pos   INT,
 Element  VARCHAR(1000)
)
AS
BEGIN
 DECLARE @Num INT;
 SELECT @Num = 1;
 DECLARE @NUMS TABLE(n INT NOT NULL);

 WHILE @Num < LEN(@String) + 1
 BEGIN
  INSERT INTO @NUMS(n) VALUES(@Num)
  SET @Num = @Num + 1
 END;

 INSERT INTO @SplitTable
 SELECT n - LEN(REPLACE(LEFT(s, n), @Separator, '')) + 1 as pos,
     SUBSTRING(s, n, CHARINDEX(@Separator, s + @Separator, n) - n) as element
 FROM (SELECT @String as s) as A
 INNER JOIN @NUMS
      ON n <= LEN(s)
     AND SUBSTRING(@Separator + s, n, 1) = @Separator;

 RETURN;
END