2017-06-21 25 views
1

這很難解釋,但我會舉一個例子。可以說我有如下表:使用TSQL如何在按字段進行分組的同時從表中返回XML?

PolicyNo ClientNo Name 
-------- -------- ---- 
    123   1  John   
    123   2  Sally 
    ABC   3  Alice 
    ABC   4  Bob 

而且我想使用TSQL和「FOR XML」,以組信息在類似的策略號,如下所示:

<root> 
    <Policy> 
     <PolicyNo> 123 </PolicyNo> 
     <ClientInfo> 
      <ClientNo> 1 </ClientNo> 
      <Name> John </Name> 
     </ClientInfo> 
     <ClientInfo> 
      <ClientNo> 2 </ClientNo> 
      <Name> Sally </Name> 
     </ClientInfo> 
    </Policy> 
    <Policy> 
     <PolicyNo> ABC </PolicyNo> 
     <ClientInfo> 
      <ClientNo> 3 </ClientNo> 
      <Name> Alice </Name> 
     </ClientInfo> 
     <ClientInfo> 
      <ClientNo> 4 </ClientNo> 
      <Name> Bob </Name> 
     </ClientInfo> 
    </Policy> 
</root> 

回答

1

這僅僅是一個補充自己,偉大的解決方案:

SELECT 
    T1.PolicyNo AS "PolicyNo", 
    (SELECT 
     T2.ClientNo AS "ClientNo", 
     T2.Name AS "Name" 
    FROM @T T2 
    WHERE T1.PolicyNo=T2.PolicyNo 
    FOR XML PATH ('ClientInfo'),TYPE) 
FROM @T T1 
GROUP BY T1.PolicyNo 
FOR XML PATH ('Policy'), ROOT ('root') 

沒有必要使用CAST(... AS XML)。只需使用,TYPE即可強制將子選擇處理爲原生XML

我不知道此刻,這是否會影響性能(讀作字符串的重鑄到XML),或者如果發動機是足夠聰明的遭遇,實際上並不需要此投...

1

其實我身材在玩了一段時間之後,回答我自己的問題。這裏是我的解決方案:

declare @T table 
(
    PolicyNo varchar(3), 
    ClientNo int, 
    Name varchar(10) 
) 

insert into @T values 
('123', 1, 'John'), 
('123', 2, 'Sally'), 
('ABC', 3, 'Alice'), 
('ABC', 4, 'Bob') 

SELECT 
    T1.PolicyNo AS "PolicyNo", 
    cast((SELECT 
     T2.ClientNo AS "ClientNo", 
     T2.Name AS "Name" 
    FROM @T T2 
    WHERE T1.PolicyNo=T2.PolicyNo 
    FOR XML PATH ('ClientInfo')) as XML) 
FROM @T T1 
GROUP BY T1.PolicyNo 
FOR XML PATH ('Policy'), ROOT ('root') 
相關問題