2016-10-20 4 views
0

다음 표에는 하나의 테이블이 있습니다. ,여러 행을 단일 XML 행으로 변환. - SQL Server

enter image description here

나는,

<Employee> 
    <EmployeeID>1</EmployeeID> 
    <FirstName>Jon</FirstName> 
    <LastName>Snow</LastName> 
    <City>North of the wall</City> 
    <Age>28</Age> 
    <Gender>Male</Male> 
</Employee> 

<Employee> 
    <EmployeeID>2</EmployeeID> 
    <FirstName>Arya</FirstName> 
    <LastName>Stark</LastName> 
    <City>Winterfell</City> 
    <Age>14</Age> 
    <Gender>Female</Male> 
</Employee> 

아래 내가 쿼리를 사용하여 시도로 직원 당 XML 형식의 데이터를 SQL 쿼리를 사용

SELECT DISTINCT EmployeeID ,( 
    SELECT 
    EmployeeID, 
    (SELECT PDFKey , 
     Replace(Value,char(CAST(0x001A as int)),'') as Value FROM TempData EE WHERE E.EmployeeID =EE.EmployeeID FOR XML PATH(''), 
    TYPE, ELEMENTS) 
    AS Employee 
    FROM 
    TempData E WHERE o.EmployeeID =E.EmployeeID 
    GROUP BY EmployeeID 
    FOR XML AUTO, ELEMENTS 
    ) AS XMLtag FROM TempData O 

싶어하지만 같은 형식의 데이터를 제공합니다

<E> 
<EmployeeID>1</EmployeeID> 
<Employee> 
    <PDFKey>FirstName</PDFKey> 
    <Value>Jon</Value> 
    <PDFKey>LastName</PDFKey> 
    <Value>Snow</Value> 
    <PDFKey>City</PDFKey> 
    <Value>North of the wall</Value> 
    <PDFKey>Age</PDFKey> 
    <Value>28</Value> 
    <PDFKey>Gender</PDFKey> 
    <Value>Male</Value> 
    </Employee> 
    </E> 

그리고 EmployeeID와 XMLdata라는 두 개의 열이있는 직원 당 한 행을 원합니다.

, 예상 출력은 아래 이미지를 참조하시기 바랍니다 enter image description here

+0

귀하의 질문에 더 구체적으로. 지금까지 뭐 해봤 어? – Jerry

답변

2
당신은 PIVOT을 사용할 수 있습니다

+ XML 경로 :

SELECT * 
FROM Employee 
PIVOT (
    MAX([Value]) FOR PDFKey IN ([FirstName],[LastName],[City],[Age],[Gender]) 
) as u 
FOR XML PATH('Employee'), TYPE 

출력 : 당신이 표를 얻을 것이다 선회 후

<Employee> 
    <EmployeeID>1</EmployeeID> 
    <FirstName>Jon</FirstName> 
    <LastName>Snow</LastName> 
    <City>North of the wall</City> 
    <Age>28</Age> 
    <Gender>Male</Gender> 
</Employee> 
<Employee> 
    <EmployeeID>2</EmployeeID> 
    <FirstName>Arya</FirstName> 
    <LastName>Stark</LastName> 
    <City>Winterfell</City> 
    <Age>14</Age> 
    <Gender>Female</Gender> 
</Employee> 

이렇게 :

EmployeeID FirstName LastName City    Age Gender 
1   Jon   Snow  North of the wall 28 Male 
2   Arya  Stark  Winterfell   14 Female 

그 후에는 PATH 모드에서 PATH 모드

로 FOR XML을 추가, 열 이름이나 열 별칭이 XPath를 식으로 처리됩니다. 이 표현식은 값이 XML에 매핑 된 인 방법을 나타냅니다. 각 XPath 표현식은 속성, 요소 및 스칼라 값과 같은 항목 유형.을 으로 제공하는 상대 XPath이고 은 행 요소 인 에 상대적으로 생성되는 노드의 이름과 계층 구조입니다. 는 XML (Transact-SQL)를 참조하십시오에 대한

또한 내가 추가 한 TYPE

SQL 서버 지원은 선택적으로 XML 쿼리에 대한 결과에 의해 xml 데이터 형식으로 반환 할 것을 요청 할 수 있습니다 TYPE 지정 문을 지정합니다.

편집

;WITH cte AS (
SELECT * 
FROM Employee 
PIVOT (
    MAX([Value]) FOR PDFKey IN ([FirstName],[LastName],[City],[Age],[Gender]) 
) as u 
) 

SELECT e.EmployeeID, 
     (SELECT * 
     FROM cte 
     WHERE EmployeeID = e.EmployeeID 
     FOR XML PATH('Employee'), TYPE) as XMLData 
FROM cte e 

출력 :

EmployeeID XMLData 
1   <Employee><EmployeeID>1</EmployeeID><FirstName>Jon</FirstName><LastName>Snow</LastName><City>North of the wall</City><Age>28</Age><Gender>Male</Gender></Employee> 
2   <Employee><EmployeeID>2</EmployeeID><FirstName>Arya</FirstName><LastName>Stark</LastName><City>Winterfell</City><Age>14</Age><Gender>Female</Gender></Employee> 
+0

이 쿼리는 완벽하게 작동하지만 EmployeeID 및 XMLdata라는 두 개의 열이있는 직원 당 하나의 행이 필요합니다. –

+0

@ gofr1, 좋은 답변, +1 내 옆에서 ... 나의 마술 유리 전구에 의하면, OP는 실제로 출력을 'INT' 열로'EmployeeID '로, 나머지는 (ID를 포함 할 수도 있음) XML에서 두 번째 열. 하위 선택으로 쉽게 달성 ... – Shnugo

+0

"https://i.stack.imgur.com/Z8syi.jpg"를 참조하십시오.이 형식으로 출력하고 싶습니다. –

관련 문제