2010-08-04 3 views
5

XML을 빌드하는 데 FOR XML PATH 명령을 사용하는 별도의 두 테이블 TV 및 수신기가 있습니다. 내 문제는 하나의 XML 출력을 만들기 위해 내 TV XML Build의 출력을 Receiver XML Build와 결합하고 싶다.T-SQL의 XML 결합

그래서 내가 (나를 TV와 수신기 태그의 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> 

문제는 그런 I 출력이 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> 

답변

5

사용 :

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