2011-01-20 5 views
12

이 테이블 구조가 있습니다. 2011, 1, 19 (각각)SQL "For XML Path"- 중첩 된 결과

DECLARE @agenda AS TABLE (
    PID INT IDENTITY(1,1) PRIMARY KEY, 
    YearPart int, 
    MonthPart int, 
    DayPart int, 
    lib_title nvarchar(200), 
    [filename] nvarchar(255), 
    meta_value nvarchar(2000) 
) 

이 샘플 데이터 사용 :

INSERT INTO @agenda VALUES (2010, 12, 4, 'Test Record', '', '') 
INSERT INTO @agenda VALUES (2011, 1, 3, 'Another Record', '', '') 
INSERT INTO @agenda VALUES (2011, 1, 3, 'Fred Birthday', '', '') 
INSERT INTO @agenda VALUES (2011, 1, 4, 'Work Day', '', '') 
INSERT INTO @agenda VALUES (2011, 12, 6, '2nd Test Record', '', '') 

내가 원하는 것은,하는 XML 출력 등이다 YearPart, MonthPart 및 날짜 부분은 ... 그들이 무엇을 설명 EX 포함 이 :

<root> 
    <Year Year="2010"> 
    <Month Month="12"> 
     <Day Day="4"> 
     <Item RecordName="Test Record" RecordID="1" /> 
     </Day> 
    </Month> 
    </Year> 
    <Year Year="2011"> 
    <Month Month="1"> 
     <Day Day="3"> 
     <Item RecordName="Another Record" RecordID="2" /> 
     <Item RecordName="Geoffrey Birthday" RecordID="3" /> 
     </Day> 
     <Day Day="4"> 
     <Item RecordName="Work Day" RecordID="4" /> 
     </Day> 
    </Month> 
    <Month Month="12"> 
     <Day Day="6"> 
     <Item RecordName="2nd Test Record" RecordID="5" /> 
     </Day> 
    </Month> 
    </Year> 
</root> 

지금까지는 중첩이 올바르게 작동하지 못했습니다. 나는 보통 그룹화를 끝낸다. (예를 들어, 하나만 있어야 할 때, 여러 Year = 2011 요소를 얻는다.) 그것은 수행 할 수 있습니다

답변

16

이 작업을 수행 할 수없는 경우, 난 항상 .NET 사이트에서 XML을 생성 할 수 있습니다

....

select 
    a1.YearPart as '@Year', 
    (select MonthPart as '@Month', 
     (select DayPart as '@Day', 
     (select 
      lib_title as '@RecordName', 
      PID as '@RecordID' 
      from @agenda as a4 
      where a4.DayPart = a3.DayPart and 
       a4.MonthPart = a2.MonthPart and 
       a4.YearPart = a1.YearPart 
      for xml path('Item'), type   
     ) 
     from @agenda as a3 
     where a3.YearPart = a1.YearPart and 
      a3.MonthPart = a2.MonthPart 
     group by a3.DayPart 
     for xml path('Day'), type  
    ) 
    from @agenda as a2 
    where a1.YearPart = a2.YearPart 
    group by a2.MonthPart 
    for xml path('Month'), type 
) 
from @agenda as a1 
group by YearPart 
for xml path('Year'), root 
+0

우수! 나는 내가 가깝다는 것을 알고 있었다. 나는 내 그룹을 잘못 생각했다. ... 감사합니다. Mikael ... 내가 필요한 것을 정확하게합니다. –