结合来自T-SQL的XML

sca*_*cci 5 xml sql t-sql sql-server sql-server-2008

我有两个单独的表TV和Receivers,我使用FOR XML PATH命令来构建XML.我的问题是我想将TV XML Build的输出与我的Receiver XML Build结合起来创建一个XML输出.

所以我会有这样的东西(这使我能够在FilterData Root中保持电视和接收器标签分开):

<FilterData>
<TVs>
    <TV>
        <Type>LCD</Type>
        <Brand>Samsung</Brand>
    </TV>
    <TV>
        <Type>LCD</Type>
        <Brand>Panasonic</Brand>
    </TV>
</TVs>
<Receivers>
    <Receiver>
        <Type>Surround 7.1</Type>
        <Brand>Onkyo</Brand>
    </Receiver>
    <Receiver>
        <Type>Surround 7.1</Type>
        <Brand>Denon</Brand>
    </Receiver>
</Receivers>
</FilterData>
Run Code Online (Sandbox Code Playgroud)

问题是当我构建我的查询以输出这个XML时

Select
Type
,Brand
From dbo.TVs
FOR XML PATH('TV'),ROOT('TVS') TYPE
Run Code Online (Sandbox Code Playgroud)

Select
Type
,Brand
From dbo.Receivers
FOR XML PATH('Receiver'),ROOT('Receivers') TYPE
Run Code Online (Sandbox Code Playgroud)

我不知道如何将这些结合起来看起来像一个例子:

<FilterData>
<TVs>
    <TV>
        <Type>LCD</Type>
        <Brand>Samsung</Brand>
    </TV>
    <TV>
        <Type>LCD</Type>
        <Brand>Panasonic</Brand>
    </TV>
</TVs>
<Receivers>
    <Receiver>
        <Type>Surround 7.1</Type>
        <Brand>Onkyo</Brand>
    </Receiver>
    <Receiver>
        <Type>Surround 7.1</Type>
        <Brand>Denon</Brand>
    </Receiver>
</Receivers>
Run Code Online (Sandbox Code Playgroud)

OMG*_*ies 7

使用:

 SELECT (SELECT t.type, t.brand
           FROM dbo.TVs t
        FOR XML PATH('tv'), ROOT('tvs'), ELEMENTS, TYPE),
       (SELECT r.type, r.brand
          FROM dbo.Receivers r
       FOR XML PATH('receiver'), ROOT('receivers'), ELEMENTS, TYPE)
FOR XML PATH('filterdata')
Run Code Online (Sandbox Code Playgroud)

测试使用:

WITH tvs AS (
    SELECT 'LCD' AS type, 'Samsung' AS brand
    UNION ALL
    SELECT 'LCD' AS type, 'Panasonic' AS brand),
     receivers AS (
    SELECT 'Surround 7.1' AS type, 'Onkyo' AS brand
    UNION ALL
    SELECT 'Surround 7.1', 'Denon')
 SELECT (SELECT t.type, t.brand
           FROM tvs t
        FOR XML PATH('tv'), ROOT('tvs'), ELEMENTS, TYPE),
       (SELECT r.type, r.brand
          FROM receivers r
       FOR XML PATH('receiver'), ROOT('receivers'), ELEMENTS, TYPE)
FOR XML PATH('filterdata')
Run Code Online (Sandbox Code Playgroud)