从SQL Server中的查询返回正确的xml结构

时间:2015-12-04 04:35:46

标签: sql-server xml tsql

我尝试从多个子表中的使用者父表和内部联接中选择数据,并将其作为XML返回。

我有Consumer父表和2个子表ConsumerPhone和Consumer Address。

我想要的输出应该是这样的

<Consumer Username="eallen">
  <ConsumerPhone/>
  <ConsumerAddress />
</Consumer>
<Consumer Username="jgibson">
  <ConsumerPhone/>
  <ConsumerAddress />
</Consumer>

但我的查询(我认为是问题)是将消费者地址放在ConsumerPhone元素

<Consumer Username="eallen">
  <ConsumerPhone>
    <ConsumerAddress />
  </ConsumerPhone>
</Consumer>
<Consumer Username="jgibson">
  <ConsumerPhone>
    <ConsumerAddress />
  </ConsumerPhone>
</Consumer>

这是查询

SELECT Consumer.Username,ConsumerPhone.Number,ConsumerAddress.Country
  FROM [dbo].[Consumer] Consumer
  LEFT JOIN  [dbo].[ConsumerPhone] ConsumerPhone
  ON Consumer.ConsumerID = ConsumerPhone.ConsumerID

  LEFT JOIN  [dbo].[ConsumerAddress] ConsumerAddress
  ON Consumer.ConsumerID = ConsumerAddress.ConsumerID
   order by Consumer.ConsumerID asc
  OFFSET 100 ROWS
 FETCH NEXT 100 ROWS ONLY
 FOR XML AUTO;

我不确定如何修复我的查询以获取我正在寻找的输出。

由于

我将其更改为使用嵌套的FOR XML语句以允许在正确的元素中使用多个值。

    SELECT
   Consumer.*,
   (SELECT
       cp.*
        FROM dbo.ConsumerPhone cp
        WHERE cp.ConsumerID = Consumer.ConsumerID
        FOR XML PATH('ConsumerPhone'), TYPE
       ) AS 'ConsumerPhoneNos'
    FROM dbo.Consumer Consumer
    where Consumer.ConsumerID = 220901
FOR XML PATH('Consumer'), ROOT('Consumers')

1 个答案:

答案 0 :(得分:1)

这将有效:

     SELECT Consumer.Username AS "@Username",
            ConsumerPhone.Number AS "ConsumerPhone",
            ConsumerAddress.Country AS "ConsumerAddress"
     FROM [dbo].[Consumer] Consumer
     LEFT JOIN  [dbo].[ConsumerPhone] ConsumerPhone
     ON Consumer.ConsumerID = ConsumerPhone.ConsumerID

     LEFT JOIN  [dbo].[ConsumerAddress] ConsumerAddress
     ON Consumer.ConsumerID = ConsumerAddress.ConsumerID
     order by Consumer.ConsumerID asc
     OFFSET 100 ROWS
     FETCH NEXT 100 ROWS ONLY
     FOR XML PATH ('Consumer');