2016-06-16 6 views
0

とT-SQLのXML結果私は、次の表の構造を持っている:Listnodeと構造

お客様

CustomerId Name   City 
1   Richie Rich  MyCity 
2   Bernie Bertel MyTown 

コンタクト:

ContactId CustomerId Name Telephone 
1   1   Test 123123 

私はXMLで結果を取得したいです次のような構造:

<Customers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Customers> 
    <Name>Richie Rich</Name> 
    <City>MyCity</City> 
    <Contacts> 
     <Contact xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <Name>Test</Name> 
     <Telephone>123123</Telephone> 
     </Contact> 
    </Contacts> 
    </Customers> 
    <Customers> 
    <Name>Bernie Bertel</Name> 
    <City>MyTown</City> 
    <Contacts xsi:nil="true" /> 
    </Customers> 
</Customers> 

対応するT-SQLクエリである:さらなる処理のため

SELECT 
    Name, 
    City, 
    (
     SELECT 
      Name, 
      Telephone 
     FROM Contacts 
     WHERE (Customers.CustomerId = Contacts.CustomerId) 
     FOR XML PATH ('Contact'), TYPE, ELEMENTS XSINIL 
    ) AS Contacts 
FROM Customers 
FOR XML AUTO, ROOT('Customers'), TYPE, ELEMENTS XSINIL 

、Iは、リストのノード(接点)の構造を知っていなければなりません。したがって、Customersに連絡先がない場合(2番目のエントリのように)、Customerノードにあるフィールド/列を知っている必要があります。

誰でもこれを解決する方法を知っていますか?

答えて

2

あなたが正しく理解していれば、連絡先がない場合はダミー行を作成する必要があります。

SELECT 
    Name, 
    City, 
    (
     SELECT * FROM (
     SELECT 
      Name, 
      Telephone 
     FROM Contacts 
     WHERE (Customers.CustomerId = Contacts.CustomerId) 
     UNION ALL 
     SELECT 
      NULL AS Name, 
      NULL AS Telephone 
     WHERE NOT EXISTS (SELECT 1 FROM Contacts WHERE Customers.CustomerId = Contacts.CustomerId) 
     ) x 
     FOR XML PATH ('Contact'), TYPE, ELEMENTS XSINIL 
    ) AS Contacts 
FROM Customers 
FOR XML AUTO, ROOT('Customers'), TYPE, ELEMENTS XSINIL 

これは、これを生成します。

<Customers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Customers> 
    <Name>Richie Rich</Name> 
    <City>MyCity</City> 
    <Contacts> 
     <Contact xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <Name>Test</Name> 
     <Telephone>123123</Telephone> 
     </Contact> 
    </Contacts> 
    </Customers> 
    <Customers> 
    <Name>Bernie Bertel</Name> 
    <City>MyTown</City> 
    <Contacts> 
     <Contact xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <Name xsi:nil="true" /> 
     <Telephone xsi:nil="true" /> 
     </Contact> 
    </Contacts> 
    </Customers> 
</Customers> 
+0

これは私が必要なものです。ありがとうございます。 –

+0

偉大な答え!それに投票した... – Shnugo