代码之家  ›  专栏  ›  技术社区  ›  Nelson Rothermel

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

  •  0
  • Nelson Rothermel  · 技术社区  · 16 年前

    可以同时选择多个表吗?例如,我可以:

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

    <data>
      <articles>
        <article>...</article>
        ...
      </articles>
      <articleTypes>
        <articleType>...</articleType>
        ...
      </articleTypes>
    </data>
    
    3 回复  |  直到 16 年前
        1
  •  2
  •   Andomar    16 年前

    联合中的每一列只有一个列名,该列名取自第一个查询。您可以通过将另一个表中的列设置为 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>
    
        2
  •  0
  •   Community Mohan Dere    9 年前

    取决于您使用的SQL Server版本。像这样的东西怎么样 post ?

        3
  •  0
  •   ZVV    15 年前

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

    1. 在主控制表和每个主键行中使用光标:
      • 生成多级XML路径输出并将其放入XML变量中
    2. 一旦获取了游标输出中的所有数据,就可以创建tempXMLOutput表

    这将显示所有的数据,而不需要奇怪的重复列,而且编码也不会花费很长时间。