2010-08-04 17 views
5

Mam dwie osobne tabele telewizorów i odbiorników, w których używam poleceń FOR XML PATH do budowania XML off. Mój problem polega na tym, że chcę połączyć wyjście mojego pliku TV XML Build z moją kompilacją XML odbiornika, aby utworzyć jedno wyjście XML.Połączyć XML z T-SQL

Więc chciałbym mieć coś takiego (co pozwala mi zachować telewizory i odbiorniki tagi osobne w 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> 

Problem polega na tym, że kiedy budować moje zapytania do wyjścia to XML

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

I

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

nie jestem pewien, w jaki sposób połączyć te wyglądają jak TH Przykład E:

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

Odpowiedz

5

Zastosowanie:

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

mierzy się za pomocą:

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