2014. 11. 26. 09:55 IT/MSSQL
콤마로 된 문자열을 테이블로 변환 함수
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
콤마로 된 문자열을 테이블로 변환 함수
[ DelimitedSplit8K ]
1. 테이블 반환 함수
2. ItemNumber : 순번, Item : 각 콤마구분값
3. InputParameter : @pString - 문자열, @pDelimiter - 구분값(char(1))
- CREATE FUNCTION dbo.DelimitedSplit8K
- /***************************************************************************************************
- Purpose:
- Split a given string at a given delimiter and return a list of the split elements (items).
- Usage Example:
- SELECT *
- FROM dbo.DelimitedSplit8K(@StringToSplit, @Delimiter)
- Returns:
- iTVF containing the following:
- ItemNumber = Element position of Item as a BIGINT (not converted to INT to eliminate a CAST)
- Item = Element value as a VARCHAR(8000)
- Notes:
- 1. Optimized for VARCHAR(8000) or less.
- 2. Optimized for single character delimiter.
- 3. Optimized for use with CROSS APPLY.
- 4. Does not "trim" elements just in case leading or trailing blanks are intended.
- 5. cteTally concept originally by Iztek Ben Gan and "decimalized" by Lynn Pettis (and others) for a
- bit of extra speed and finally redacted by Jeff Moden for a different slant on readability and
- compactness.
- 6. If you don't know how a Tally table can be used to replace loops, please see the following...
- http://www.sqlservercentral.com/articles/T-SQL/62867/
- Revision History:
- Rev 00 - 20 Jan 2010 - Jeff Moden
- - Base 10 redaction for CTE.
- Rev 01 - 08 Mar 2010 - Jeff Moden
- - Changed UNION ALL to UNPIVOT for bit of extra speed.
- Rev 02 - 13 Mar 2010 - Jeff Moden
- - Removed one additional concatenation and one subtraction from the SUBSTRING in the
- SELECT List.
- ***************************************************************************************************/
- --===== Define I/O parameters
- (
- @pString VARCHAR(8000),
- @pDelimiter CHAR(1)
- )
- RETURNS TABLE
- AS
- RETURN
- WITH --"Inline" CTE Driven "Tally Table" produces values up to 10K... enough to cover VARCHAR(8000).
- E1(N) AS (SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
- SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
- SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1),--10
- E2(N) AS (SELECT 1 FROM E1 a, E1 b), --100
- E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10,000
- cteTally(N) AS (SELECT ROW_NUMBER() OVER (ORDER BY N) FROM E4)
- --===== Do the split
- SELECT ROW_NUMBER() OVER (ORDER BY N) AS ItemNumber,
- SUBSTRING(@pString, N, CHARINDEX(@pDelimiter, @pString + @pDelimiter, N) - N) AS Item
- FROM cteTally
- WHERE N < LEN(@pString) + 2
- AND SUBSTRING(@pDelimiter + @pString, N, 1) = @pDelimiter
- ;
<사용예>
1. 문자열 관련
SELECT * FROM DelimitedSplit8K('을지문덕,홍길동,가가가,일반적,소리샘,케이티,왔구나,뭘까요,납니다요,ㅋㅋㅋㅋㅋㅋㅋㅋ,긴문장을보여드리겠습니다. 뭐가 길까요알아서 맞춰보시길',',')
2. 테이블과 조인
- CROSS APPLY를 위해 SQL2005 이상 가능 ( 호환성모드 90 이상 )
- SELECT t.아이디,t.콤마로된필드,b.itemNumber,b.item
- FROM 대상테이블 t
- CROSS APPLY dbo.DelimitedSplit8K(t.m_interest,',') B
- WHERE isnull(t.콤마로된필드,'') <> ''
- ORDER BY T.아이디
[ fn_Split ]
1. 테이블 반환 함수
2. 각 콤마구분값
3. InputParameter : @Sql - 문자열, @Splits - 구분값
- CREATE FUNCTION [dbo]. [fn_Split] ( @Sql VARCHAR (8000), @Splits VARCHAR (10))
- RETURNS @temp TABLE (item VARCHAR (100))
- AS
- BEGIN
- Declare @i Int
- SET @Sql = RTrim (LTrim (@Sql))
- SET @i = CharIndex (@Splits, @Sql)
- WHILE @i > =1
- Begin
- INSERT @temp VALUES(Left (@Sql, @i-1))
- SET @Sql = SUBSTRING (@Sql, @i + 1, LEN (@Sql ) - @i)
- SET @i = CHARINDEX (@Splits, @Sql)
- END ;
- IF @Sql < > ''
- INSERT @temp VALUES(@Sql)
- RETURN
- END
<사용예>
- SELECT * FROM fn_Split('을지문덕,홍길동,가가가,일반적,소리샘,케이티,왔구나,뭘까요,납니다요,ㅋㅋㅋㅋㅋㅋㅋㅋ,긴문장을보여드리겠습니다. 뭐가 길까요알아서 맞춰보시길',',')
'IT > MSSQL' 카테고리의 다른 글
MSSQL 함수 모음 (0) | 2014.12.30 |
---|---|
FullText Search (0) | 2014.10.13 |
MSSQL 인덱스(Index) 생성 (0) | 2014.08.20 |
Code Formatter. 코드 정렬 도구. (0) | 2014.06.10 |
MSSQL 사용자 테이블 및 SP권한 부여 쿼리 (0) | 2014.05.08 |