【问题标题】:How to insert element after root node in multiple xml output via FOR XML in SQL server如何通过 SQL Server 中的 FOR XML 在多个 xml 输出中的根节点之后插入元素
【发布时间】:2017-02-03 17:04:56
【问题描述】:

我正在尝试在 SQL Server 中使用“FOR XML”功能。我正在使用 SQL Server 2008 Express。我需要 SQL Server 的 XML 结果。

我有两个表,dbo.document 和 dbo.items。

样本数据:

第一个表[文档]:

     ID   info1  info2
-------   ----   ----- 
      1    11      22

第二张表【物品】:

     ID   nvarchar1   nvarchar2   nvarchar3  docId
-------   ----        ----       ----        ----
      1    d          e          f            1
      2   dd          ee         ff           1

基于Create single XML from SQL Server multiple tables queryGet nested XML output sql serverSQL Server “FOR XML” output from queries joining two tables 我的代码是:

SELECT     TOP (1)Document.info1, Document.info2,
(SELECT     TOP (3)
nvarchar1,
nvarchar2,
nvarchar3
FROM         Items 
WHERE Items.docId = Document.id
FOR XML PATH ('myitem'), TYPE)
FROM         Document
order by id desc
FOR XML PATH ('List'), ROOT ('myroot')

结果是:

 <myroot>    
      <List>
      <info1>11</info1>
      <info2>22</info2> 
        <myitem>
          <nvarchar1>d</nvarchar1>
          <nvarchar2>e</nvarchar2>
          <nvarchar3>f</nvarchar3>
        </myitem>
        <myitem>
          <nvarchar1>dd</nvarchar1>
          <nvarchar2>ee</nvarchar2>
          <nvarchar3>ff</nvarchar3>
        </myitem>
      </List>
    </myroot>

但我想要以下格式的 xml:(在 myroot 之后直接插入元素 info1、info2)

<myroot>    
<info1>11</info1>
<info2>22</info2>   
      <List>
        <myitem>
          <nvarchar1>d</nvarchar1>
          <nvarchar2>e</nvarchar2>
          <nvarchar3>f</nvarchar3>
        </myitem>
        <myitem>
          <nvarchar1>dd</nvarchar1>
          <nvarchar2>ee</nvarchar2>
          <nvarchar3>ff</nvarchar3>
        </myitem>
      </List>
    </myroot>

有人对此案有任何解决方案吗?非常感谢。
注意:下一个变体:info1,info 2 将存储在第三个表中。

【问题讨论】:

    标签: sql-server xml sql-server-2008 nested output


    【解决方案1】:

    尝试将 ROOT('List') 设置为嵌套的 select 语句,然后将外部选择的 PATH 设置为 '',如下所示:

    SELECT TOP (1)
            Document.info1
            , Document.info2
            ,(
                SELECT TOP (3)
                        nvarchar1
                        ,nvarchar2
                        ,nvarchar3
                    FROM Items
                    WHERE
                        Items.docId = Document.id
                    FOR XML PATH ('myitem'),ROOT ('List'), TYPE
            )
        FROM Document
        ORDER BY ID DESC
        FOR XML PATH (''), ROOT ('myroot')
    

    应该可以的。

    【讨论】:

    • 是的,谢谢@RicGuerrero。我还有一个问题:如果我需要将 ... 放在下一个级别之间,例如 ... myitem> ----> 所以最终结果将是 ... ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多