SQL Server“for xml”,多个表,多个节点

时间:2010-05-18 15:08:45

标签: sql-server xml

是否可以一次选择多个表格?例如,我可以这样做:

SELECT (
  SELECT * FROM Articles
  FOR XML PATH('article'), TYPE
)
FOR XML PATH('articles'), ROOT('data')

SELECT (
  SELECT * FROM ArticleTypes
  FOR XML PATH('articleType'), TYPE
)
FOR XML PATH('articleTypes'), ROOT('data')

我可以加入两者以便获得以下输出吗?我不能使用UNION,因为表结构不匹配。

<data>
  <articles>
    <article>...</article>
    ...
  </articles>
  <articleTypes>
    <articleType>...</articleType>
    ...
  </articleTypes>
</data>

3 个答案:

答案 0 :(得分:2)

union中的每个列只有一个列名,该列名取自第一个查询。您可以通过将其他表中的列设置为null来解决这个问题,而不是省略它们。

select *
from (
    select 
        1 as 'Articles/Id'
    ,   'Name' as 'Articles/Name'
    ,   null as 'ArticleType/Id'
    ,   null as 'ArticleType/Type'
) Articles
union all
select *
from (
    select 
        null as 'Articles/Id'
    ,   null as 'Articles/Name'
    ,   1 as 'ArticleType/Id'
    ,   'Type' as 'ArticleType/Type'
) ArticleType
FOR XML PATH(''), ROOT('data')

这导致:

<data>
    <Articles>
        <Id>1</Id>
        <Name>Name</Name>
    </Articles>
    <ArticleType>
        <Id>1</Id>
        <Type>Type</Type>
    </ArticleType>
</data>

答案 1 :(得分:0)

取决于您使用的SQL Server版本。像这样的堆栈如何溢出post

答案 2 :(得分:0)

可以不列出表中的所有列,不必使用UNION,也不必使用以下方法重复列:

  1. 将您需要的数据导入临时表(在我的情况下,它来自使用openquery的其他服务器,因此它更简单但如果行是本地的则可以跳过)
  2. 通过主控制表和每个主键行的光标:
    • 生成多级XML路径输出并将其放入xml变量
    • 将xml变量插入到输出tempXMLOutput表中,其中包含xml
    • 类型的列
  3. 在光标输出中获取所有数据后,您的tempXMLOutput表
  4. 这将显示没有时髦重复列的所有数据,并且编码不需要很长时间。