2011-01-20 7 views
12

Ho questa struttura tabella. YearPart, MonthPart e DatePart contengono ciò che essi descrivono ... EX: 2011, 1, 19 (rispettivamente)SQL "Per percorso XML" - risultati nidificati

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

Utilizzando questi dati di esempio:

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

Quello che voglio, è un output XML come this:

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

Finora, non sono stato in grado di far funzionare correttamente il nesting. Di solito finisco con il raggruppamento (ad esempio, ottengo più elementi Anno = 2011, quando dovrebbe essercene solo uno).

Se ciò non può essere fatto, posso sempre creare il XML sul sito .NET ...

risposta

16

Si può fare.

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

Eccellente! Sapevo di essere vicino ... Ho sbagliato i miei gruppi ... grazie a Mikael ... fa esattamente quello di cui avevo bisogno. –

Problemi correlati