2010-08-04 18 views
5

Ho due tabelle TV e ricevitori separate che sto utilizzando i comandi PATH FOR XML per creare XML off. Il mio problema è che voglio combinare l'output del mio TV XML Build con il mio ricevitore XML Build per creare un output XML.Combina XML da T-SQL

quindi vorrei avere qualcosa di simile (che mi permette di tenere i televisori e ricevitori separare i tag all'interno del 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> 

Il problema è che quando ho costruito le mie domande a uscita questo XML

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

E

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

non sono sicuro di come combinare questi per assomigliare ° E Esempio:

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

risposta

5

Usa:

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

testata utilizzando:

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