如何将XML AUTO与SQL结合使用以创建包含两个嵌套表的结构

如何将XML AUTO与SQL结合使用以创建包含两个嵌套表的结构,sql,sql-server,xml,Sql,Sql Server,Xml,谢谢你的阅读。 我目前正在尝试将XMLAuto与3个表一起使用,以生成一个XML文档,该文档包含1个顶级表和2个不同的子级表 一个包含两个表的简单示例: SELECT dbo.SalesOrder.SupplementaryReference AS SupplementaryReference, dbo.SalesOrder.Address AS Address, dbo.SalesOrder.Address2 AS Address2, dbo.SalesOrder.CardCo

谢谢你的阅读。 我目前正在尝试将XMLAuto与3个表一起使用,以生成一个XML文档,该文档包含1个顶级表和2个不同的子级表

一个包含两个表的简单示例:

SELECT
  dbo.SalesOrder.SupplementaryReference AS SupplementaryReference,
  dbo.SalesOrder.Address AS Address,
  dbo.SalesOrder.Address2 AS Address2,
  dbo.SalesOrder.CardCode AS CardCode,
  dbo.SalesOrder.DocDate AS DocDate,
  dbo.SalesOrder.DocDueDate AS DocDueDate,
  dbo.SalesOrderLines.ItemCode AS ItemCode,
  dbo.SalesOrderLines.Quantity AS Quantity
FROM
  dbo.SalesOrderLines,
  dbo.SalesOrder
WHERE
  dbo.SalesOrderLines.SupplementaryReference = dbo.SalesOrder.SupplementaryReference
FOR XML AUTO, ELEMENTS, ROOT('root')
这将生成如下输出xml文档:

<root>
  <dbo.SalesOrder>
    <Address>...</Address>
    <Address2>...</Address2>
    .....
    .....
    <dbo.SalesOrderLines>
      <ItemCode>...</ItemCode>
      <Quantity>...</Quantity>
    </dbo.SalesOrderLines>
  </dbo.SalesOrder>
</root>
SELECT so.[Address]
      ,so.Address2
      /*more columns*/
      ,(
        SELECT sol.ItemCode
              ,sol.Quantity 
        FROM dbo.SalesOrderLines AS sol
        WHERE so.SupplementaryReference =sol.SupplementaryReference 
        FOR XML PATH('dbo.SalesOrderLines'),TYPE --only one row???
       ) AS [node()]
      ,(
        SELECT sol.ItemCode
              ,sol.Quantity 
        FROM dbo.SalesOrderExpenses AS soe
        WHERE so.SupplementaryReference =soe.SupplementaryReference 
        FOR XML PATH('dbo.SalesOrderLines'),TYPE --only one row???
       ) AS [node()]
FROM dbo.SalesOrder AS so
但是,我收到的输出将第三个表嵌套在第二个表中:

<root>
  <dbo.SalesOrder>
    <Address>...</Address>
    <Address2>...</Address2>
    .....
    .....
    <dbo.SalesOrderExpenses>
      <BaseType>...</BaseType>
      <ExpnsCode>...</ExpnsCode>
      <LineTotal>...</LineTotal>
      <dbo.SalesOrderLines>
        <ItemCode>...</ItemCode>
        <Quantity>...</Quantity>
      </dbo.SalesOrderLines>
    </dbo.SalesOrderExpenses>
  </dbo.SalesOrder>
</root>

...
...
.....
.....
...
...
...
...
...
有什么想法吗?
谢谢您的时间。

如果没有示例数据,您很难给出建议,但您可能正在寻找以下内容:

<root>
  <dbo.SalesOrder>
    <Address>...</Address>
    <Address2>...</Address2>
    .....
    .....
    <dbo.SalesOrderLines>
      <ItemCode>...</ItemCode>
      <Quantity>...</Quantity>
    </dbo.SalesOrderLines>
  </dbo.SalesOrder>
</root>
SELECT so.[Address]
      ,so.Address2
      /*more columns*/
      ,(
        SELECT sol.ItemCode
              ,sol.Quantity 
        FROM dbo.SalesOrderLines AS sol
        WHERE so.SupplementaryReference =sol.SupplementaryReference 
        FOR XML PATH('dbo.SalesOrderLines'),TYPE --only one row???
       ) AS [node()]
      ,(
        SELECT sol.ItemCode
              ,sol.Quantity 
        FROM dbo.SalesOrderExpenses AS soe
        WHERE so.SupplementaryReference =soe.SupplementaryReference 
        FOR XML PATH('dbo.SalesOrderLines'),TYPE --only one row???
       ) AS [node()]
FROM dbo.SalesOrder AS so
顺便说一句:避免使用老式的联接,即使用逗号添加表名,并在
where
子句中设置联接谓词。最好使用适当的
连接
。在这种情况下,这是一个
内部联接