2011-01-20 12 views
12

Bu tablo yapısına sahibim. 2011, 1, 19 (sırasıyla)SQL "XML Yolu İçin" - iç içe geçmiş sonuçlar

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

Bu örnek verileri kullanarak:

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

İstediğim, bir XML çıkışı gibidir YearPart, MonthPart ve DatePart ... onların yakıştırdıkları şeylerden EX içerirler Bu, şu ana kadar yuvalama işlemini doğru yapamadım. Şimdiye kadar, yuvalama işini doğru yapamadım. Şimdiye kadar. Genellikle gruplandırmayla sona ererim (örneğin, yalnızca bir tane olması gerektiğinde, birden çok Yıl = 2011 öğesi alıyorum). Yapılabilir

cevap

16

bu yapılamaz ise, hep .NET sitesinde XML oluşturabilir

....

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

Mükemmel! Yakın olduğumu biliyordum ... Gruplarım yanlıştı ... teşekkürler Mikael ... tam olarak ihtiyacım olan şeyi yaptım. –