如何将XML AUTO与SQL一起使用来创建具有2个嵌套表的结构

时间:2016-11-16 15:26:49

标签: sql sql-server xml

谢谢你的阅读。 我目前正在尝试使用带有3个表的XML AUTO来生成一个xml文档,其中包含1个顶级和2个不同的子级别表。

一个包含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>

这是我所期望的,但是我试图从3个表SalesOrder,SalesOrderLines和SalesOrderExpenses中获取XML文档,如下所述:

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

我尝试过以下查询:

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.SelesOrderExpenses.BasteType AS BaseType,
  dbo.SelesOrderExpenses.ExpnsCode AS ExpnsCode,
  dbo.SelesOrderExpenses.LineTotal AS LineTotal,
  dbo.SalesOrderLines.ItemCode AS ItemCode,
  dbo.SalesOrderLines.Quantity AS Quantity
FROM
  dbo.SalesOrderLines,
  dbo.SalesOrderExpenses,
  dbo.SalesOrder
WHERE
  dbo.SalesOrderLines.SupplementaryReference = dbo.SalesOrder.SupplementaryReference
FOR XML AUTO, ELEMENTS, ROOT('root')

然而我收到的这个输出将第三个表嵌在第二个表中:

<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>

那么任何想法? 谢谢你的时间。

1 个答案:

答案 0 :(得分:1)

没有样本数据,提供建议有点困难,但您可能正在寻找类似的东西:

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子句中设置连接谓词。更好地使用适当的JOIN。在这种情况下,这是INNER JOIN ...