【问题标题】:Combine XML from T-SQL从 T-SQL 组合 XML
【发布时间】:2023-03-11 14:57:01
【问题描述】:

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

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

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

问题是当我构建查询以输出此 XML 时

Select
Type
,Brand
From dbo.TVs
FOR XML PATH('TV'),ROOT('TVS') TYPE

Select
Type
,Brand
From dbo.Receivers
FOR XML PATH('Receiver'),ROOT('Receivers') TYPE

我不知道如何将这些组合起来看起来像示例:

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

【问题讨论】:

    标签: sql sql-server xml tsql sql-server-2008


    【解决方案1】:

    用途:

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

    测试使用:

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

    【讨论】:

      【解决方案2】:
      DECLARE @tvs TABLE
      (
            [Type]    varchar(20) not null
          , [Brand]   varchar(50) not null
      )
      
      DECLARE @receivers TABLE
      (
            [Type]    varchar(20) not null
          , [Brand]   varchar(50) not null
      )
      
      INSERT INTO @tvs([Type], [Brand]) Values('LCD', 'Samsung'), ('LCD', 'Panasonic');
      INSERT INTO @receivers([Type], [Brand]) Values('Surround 7.1', 'Onkyo'), ('Surround 7.1', 'Dennon');
      
      
      
      SELECT
          (
              SELECT
                    [Type]
                  , [Brand]
              FROM
                  @tvs
              FOR XML PATH('TV'),ROOT('TVS'), TYPE
          )
          ,
          (
              SELECT
                    [Type]
                  , [Brand]
              FROM
                  @receivers
              FOR XML PATH('Receiver'),ROOT('Receivers'), TYPE
          )
      FOR XML PATH('FilterData');    
      

      【讨论】:

        猜你喜欢
        • 2021-10-21
        • 1970-01-01
        • 1970-01-01
        • 2020-06-01
        • 1970-01-01
        • 2016-01-07
        • 2022-01-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多