微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从SQLServer 返回树型Xml

数据库表结构如下

要得到

Channel    

         account         

               campaign

这样的树型Xml结构, sql 语句如下:

select ch.ChannelName as "@Text",(select a.AccountName as "@Text",(select c.CampaignName as "@Text" 

                from Campaign c

                where c.AccountId = A.AccountId

                FOR XML PATH('Campaign'),TYPE

                )  

        from Account a

        where a.ChannelId = ch.ChannelId

        and a.AccountId <> 0

        FOR XML PATH('Account'),TYPE

        )

from Channel ch

where ch.ChannelId <> 0

order by ChannelName

FOR XML PATH('Channel'),ROOT('Tree')

输出结果如下:

<Tree>

  <Channel Text="Astrology">

    <Account Text="MSN Astrology">

      <Campaign Text="Astrology" />

    </Account>

    <Account Text="MSN Astrology">

      <Campaign Text="Astrology - Chinese" />

      <Campaign Text="Astrology - General" />

      <Campaign Text="Astrology - Charts & Reports" />

    </Account>

  </Channel>

  <Channel Text="Autos">

    <Account Text="MSN Auto">

      <Campaign Text="MSN Autos" />

      <Campaign Text="MSN Autos_TSA" />

    </Account>

    <Account Text="MSN Autos">

      <Campaign Text="Certified Pre-Owned/Used" />

      <Campaign Text="General Auto/Car" />

      <Campaign Text="Homepage" />

    </Account>

  </Channel>

</Tree>
 
几点说明:
TYPE : We can Leverage the new TYPE directive to generate XML data type instances (otherwise,you will get a textual result that will be entitized if it is embedded in another FOR XML query) and nest sub selections to define the hierarchy.
PATH: The PATH mode allows you to use an XPath-like Syntax as a column name,which 
then is mapped into an attribute (e.g.,"@a"),element (e.g.,"e"),sub element structure ("e1/e2"),element content 
("*"),text node ("text()"),or data value ("data()"). As 
with the RAW mode,the default name for the row element is row and can be 
overwritten with an NCName (a name without a prefix).
若data()用于多个数据集时,会输出一个多个数据集以空格为间隔的记录,可参见下面OrderID。
msdn上有一篇例文, 其中有一例子如下(连接的是northwind数据库):
SELECT CustomerID as "@ID",(SELECT OrderID as "data()"

       FROM Orders

       WHERE Customers.CustomerID=Orders.CustomerID

       FOR XML PATH('')

      ) as "@OrderIDs",CompanyName,ContactTitle as "ContactName/@ContactTitle",ContactName as "ContactName/text()",PostalCode as "Address/@ZIP",Address as "Address/Street",City as "Address/City"

FROM Customers

FOR XML PATH('Customer')
 
输出为:
<Customer ID="HUNGC" OrderIDs="10375 10394 10415 10600 10660">

  <CompanyName>Hungry Coyote Import Store</CompanyName>

  <ContactName 

     ContactTitle="Sales Representative">Yoshi Latimer</ContactName>

  <Address ZIP="97827">

    <Street>City Center Plaza 516 Main St.</Street>

    <City>Elgin</City>

  </Address>

</Customer>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐