2017-07-20 16 views
4

我正在處理一些包含XML片段的行。如何在GROUP BY操作中聚合XML片段

我在他們目前的狀態行是這樣的:

TeamId  Player 
---------------------------------------------------------------------------- 
1 | <Player><FirstName>Bob</FirstName><LastName>Smith</LastName></Player> 
1 | <Player><FirstName>Sam</FirstName><LastName>Jones</LastName></Player> 
2 | <Player><FirstName>David</FirstName><LastName>White</LastName></Player> 
2 | <Player><FirstName>James</FirstName><LastName>Black</LastName></Player> 

與我查詢我期待組行通過TeamId和聚合這些XML片段到父<Players>元素,所以輸出會看像這樣:

1 | <Players> 
     <Player><FirstName>Bob</FirstName><LastName>Smith</LastName></Player> 
     <Player><FirstName>Sam</FirstName><LastName>Jones</LastName></Player> 
     </Players> 
2 | <Players> 
     <Player><FirstName>David</FirstName><LastName>White</LastName></Player> 
     <Player><FirstName>James</FirstName><LastName>Black</LastName></Player> 
     </Players> 

我應該怎麼做? 非常感謝!

回答

4

只是我想這樣

CREATE TABLE #A 
    (
    TEAMID INT, 
    PLAYER XML 
    ) 
    INSERT INTO #A VALUES 
    (1,'<PLAYER><FIRSTNAME>BOB</FIRSTNAME><LASTNAME>SMITH</LASTNAME></PLAYER>'), 
    (1,'<PLAYER><FIRSTNAME>SAM</FIRSTNAME><LASTNAME>JONES</LASTNAME></PLAYER>'), 
    (2,'<PLAYER><FIRSTNAME>DAVID</FIRSTNAME><LASTNAME>WHITE</LASTNAME></PLAYER>'), 
    (2,'<PLAYER><FIRSTNAME>JAMES</FIRSTNAME><LASTNAME>BLACK</LASTNAME></PLAYER>') 


SELECT T.TEAMID, 
     ( SELECT TEAMID , 
        PLAYER 
      FROM #A AS X 
      WHERE X.TeamId = T.TeamId 
      FOR XML PATH('PLAYER'), TYPE, ROOT('PLAYERS') 

     ) AS XML_FORMAT_STRING 
FROM #A AS T 
GROUP BY T.TEAMID; 
+0

根(「運動員」) –

+0

而且連接條件是內部子查詢缺少「WHERE X.TeamId = T.TeamId」 –

+0

@KannanKandasamy謝謝:) – Chanukya

1

嘗試像這樣

SELECT tbl.TeamId, 
     ( SELECT Player AS [*] 
      FROM YourTable AS X 
      WHERE X.TeamId = tbl.TeamId 
      FOR XML PATH(''), TYPE, ROOT('Players') 
     ) AS [*] 
FROM YourTable AS tbl 
GROUP BY tbl.TeamId; 

別名AS [*]告訴引擎插入給定元素原樣。這避免了額外的名稱級別。空的PATH('')也避免了額外的名稱級別。