2017-09-05 4 views
0

내가 가진 this-테이블의 모든 레코드에 대한 구분 구분 데이터를 분할하는 기능을 작성

SELECT ID,FIELD from TABLE 

1|A 
1|B 
1|C 
1|D 
2|X 
2|Y 
2|Z 

같은 this-

select ID,FIELD from TABLE 

1| A,B,C,D 
2|X,Y,Z 

출력 등의 입력 누군가가 내가 할 수있는 방법으로 저를 도와 주 시겠어요 SQL Server 2014에서 쉽게 사용할 수 있습니까?

+0

힘든 행운, 당신은 쉼표로 구분 된 항목으로 데이터를 저장하는 사람의 나쁜 선택을 청소해야 ... – jarlh

+0

Btw, 필드가 매우 열악한 열 이름입니다. – jarlh

+0

필자는 Field를 예제로 사용했지만 실제 필드에는이 이름이 없습니다 :) –

답변

1

Aaron Bertrand의 Split strings the right way – or the next best way에서 문자열 분할 기능을 선택하고 cross apply과 함께 사용하여 테이블에서 데이터를 선택할 수 있습니다. 이 데모에서는 XML 문자열 분할 기능을 선택했습니다.
그래서 첫째, 함수 작성 :

CREATE FUNCTION dbo.SplitStrings_XML 
(
    @List  NVARCHAR(MAX), 
    @Delimiter NVARCHAR(255) 
) 
RETURNS TABLE 
WITH SCHEMABINDING 
AS 
    RETURN 
    ( 
     SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)') 
     FROM 
     ( 
     SELECT x = CONVERT(XML, '<i>' 
      + REPLACE(@List, @Delimiter, '</i><i>') 
      + '</i>').query('.') 
    ) AS a CROSS APPLY x.nodes('i') AS y(i) 
    ); 
GO 

그런 다음 당신이해야 할 모든이 같은 것입니다 :

SELECT ID, Item 
FROM TABLE 
CROSS APPLY 
dbo.SplitStrings_XML(FIELD, ',') 

See a live demo on rextester.

또한을, 당신은 아마 Is storing a delimited list in a database column really that bad?, 당신의 뜻을 읽어야합니다 이 질문에 대한 대답이 인 이유는 많이 있습니다.

+0

노력한 친구에게 감사하지만 작동하지 않습니다. 왜 확실하지 않은 이유가 무엇입니까 –

+0

당신은 조금은 작동하지 않는다는 것을 의미합니까? 오류가 있었습니까? 잘못된 결과를 얻었습니까? [나는 rextester에서 샘플 데이터를 테스트했습니다.] (http://rextester.com/DVPK21692) 그것은 나에게 잘 작동하는 것 같습니다. –

0

당신이해야 CROSS APPLYXML 필요가 없습니다 명시 Function :

SELECT ID, 
     split.a.value('.', 'NVARCHAR(MAX)') [FIELD] 
FROM 
(
    SELECT ID, 
      CAST('<M>'+REPLACE([Field], ',', '</M><M>')+'</M>' AS XML) AS String 
    FROM #TM 
) AS a 
CROSS APPLY String.nodes('/M') AS split(a); 

결과 :

ID FIELD 
1 A 
1 B 
1 C 
1 D 
2 X 
2 Y 
2 Z