SQL Server 2014 - FOR XML AUTO 避免自动节点嵌套

SQL Server 2014 - FOR XML AUTO avoid automatic node nesting

我正在尝试构建一些查询以导出 XML 中的数据,我构建了这个查询:

select
    [invoice].*,
    [rows].*,
    [payment].payerID,
    [items].picture
from InvoicesHeader [invoice]
join InvoicesRows   [rows]      on  [rows].invoiceID=[invoice].invoiceID 
join Payments       [payments]  on  [payments].paymentID=[invoice].paymentID
join Items          [items]     on  [items].itemID=[rows].itemID
FOR XML Auto, ROOT ('invoices'), ELEMENTS

我得到了这样的结果

<invoices>    
    <invoice>
        <ID>82</ID>
        <DocType>R</DocType>
        <DocYear>2017</DocYear>
        <DocNumber>71</DocNumber>
        <IssueDate>2017-07-17T15:17:30.237</IssueDate>
        <OrderID>235489738019</OrderID>
        ...
        <payments>
            <payerID>3234423f33</payerID>
            <rows>
                <ID>163</ID>
                <ItemID>235489738019</ItemID>
                <Quantity>2</Quantity>
                <Price>1</Price>
                <VATCode>22</VATCode>
                <Color>-</Color>
                <Size></Size>
                <SerialNumber></SerialNumber>
                <items>
                    <picture>http://nl.imgbb.com/AAOSwOdpXyB4I.JPG</picture>
                </items>
            </rows>
            ....

        </payments>
    </invoice>
</invoices>

虽然我想要这样的东西

[rows] is childnode of invoice and not of payments

<invoices>    
    <invoice>
        <ID>82</ID>
        <DocType>R</DocType>
        <DocYear>2017</DocYear>
        <DocNumber>71</DocNumber>
        <IssueDate>2017-07-17T15:17:30.237</IssueDate>
        <OrderID>235489738019</OrderID>
        ...
        <payments>
            <payerID>3234423f33</payerID>
        </payments>
        <rows>
            <ID>163</ID>
            <ItemID>235489738019</ItemID>
            <Quantity>2</Quantity>
            <Price>1</Price>
            <VATCode>22</VATCode>
            <Color>-</Color>
            <Size></Size>
            <SerialNumber></SerialNumber>
            <items>
                <picture>http://nl.imgbb.com/AAOSwOdpXyB4I.JPG</picture>
            </items>
        </rows>
            ....
    </invoice>
</invoices>

看到一些有很多的解决方案

FOR XML AUTO

放在一起,但是这里的数据来自connected table,相同的值重新查询2-3次就可惜了

如何实现?

谢谢

尝试将 select 顺序更改为此;

select
    [invoice].*,
    [payment].payerID,
    [items].picture,
    [rows].*

from InvoicesHeader [invoice]
join InvoicesRows   [rows]      on  [rows].invoiceID=[invoice].invoiceID 
join Payments       [payments]  on  [payments].paymentID=[invoice].paymentID
join Items          [items]     on  [items].itemID=[rows].itemID
FOR XML Auto, ROOT ('invoices'), ELEMENTS

好吧,发现必须改用 FOR XML PATH 并将另一个 table 添加为每个 FOR XML PATH 的子查询,如下所示:

select
[invoice].*,
p.payerID,
(select r.* from InvoiceRows r where r.invoiceID=i.invoiceID for XML PATH ('rows'), type)
from InvoicesHeader i
join payment        p on i.paymentID=p.paymentID
FOR XML PATH('invoice'), ROOT ('invoices'), ELEMENTS