2016-03-24 4 views
2

Erstellen Ich habe 3 Tabellen und ich brauche die drei Tabellen zu verbinden, um eine verschachtelte XML-DateiNested XML-Datei in SQL Server

Die Tische sind Veranstaltungen, UserEvents und Benutzer zu erstellen. Hier ist ein Beispiel-Schema: (! Oder etwas in diese Richtung)

create table [dbo].[Users] 
(
    UserID int, 
    Username VARCHAR(MAX) 
); 


insert into [dbo].[Users] (UserID, Username) values 
(155, 'jweldz'), 
(218, 'pwarner'), 
(310, 'jeffrey') 


create table dbo.Events 
(
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [UserId] [int] NULL, 
    [Title] [nvarchar](250) NOT NULL, 
    [EventStart] [datetime] NOT NULL, 
); 

SET IDENTITY_INSERT [Events] ON 
INSERT INTO [dbo].[Events] ([Id], [UserId], [Title], [EventStart]) 
VALUES (3409, NULL, 'Boxing Match', '2014-10-05 00:00:00.000') 


create table dbo.UserEvents 
(
    UserID int, 
    EventID int, 
); 



INSERT INTO [dbo].[UserEvents] ([UserID], [EventID]) VALUES (155, 3409), (218, 3409), (310, 3409) 

SQL Fiddle

dieses Schema verwenden würde Ich mag eine verschachtelte XML-Ausgabe in folgendem Format erstellen in SQL Server 2014 für jeden Benutzer in einem Ereignis wird ein Ereignis-Tag aufgeführt:

<EventList> 
    <Event eventid="3409"> 
    <Title>Boxing Match</Title> 
    <Player> 
     <UserID>155</UserID> 
     <Username>jweldz</Username> 
     <UserID>218</UserID> 
     <Username>pwarner</Username> 
     <UserID>310</UserID> 
     <Username>jeffrey</Username> 
    </Player> 
    <EventStart>2016-04-16T09:00:00</EventStart> 
    </Event> 
</EventList> 

Aber stattdessen erhalte ich:

<EventList> 
     <Event eventid="3409"> 
     <Title>Boxing Match</Title> 
     <Player> 
      <UserID>155</UserID> 
      <Username>jweldz</Username> 
     </Player> 
     <EventStart>2016-04-16T09:00:00</EventStart> 
     </Event> 
     <Event eventid="3409"> 
     <Title>Boxing Match</Title> 
     <Player> 
      <UserID>218</UserID> 
      <Username>pwarner</Username> 
     </Player> 
     <EventStart>2016-04-16T09:00:00</EventStart> 
     </Event> 
</EventList> 
.... 

Das Ereignis wird jedes Mal wiederholt, wenn ein neuer Spieler vorhanden ist, aber das ist nicht ideal. Wie kann ich die Player mithilfe von SQL Server 2014 in einem Ereignis-Tag verschachteln?

+0

Große Frage bekommen! Beispielcode, Geige, erwartete Ausgabe, tatsächliche Ausgabe. +1 von meiner Seite – Shnugo

Antwort

2

sollte diese Abfrage liefern, was Sie brauchen:

SELECT e.Id AS [@eventid] 
     ,e.Title 
     ,(
     SELECT u.UserID 
       ,u.Username 
     FROM dbo.Users AS u 
     INNER JOIN dbo.UserEvents AS ue ON u.UserID=ue.UserID 
     WHERE e.Id=ue.EventID 
     FOR XML PATH(''),TYPE 
    ) AS Player 
     ,e.EventStart 
FROM dbo.Events AS e 
FOR XML PATH('Event'),ROOT('EventList') 

Das Ergebnis

<EventList> 
    <Event eventid="3409"> 
    <Title>Boxing Match</Title> 
    <Player> 
     <UserID>155</UserID> 
     <Username>jweldz</Username> 
     <UserID>218</UserID> 
     <Username>pwarner</Username> 
     <UserID>310</UserID> 
     <Username>jeffrey</Username> 
    </Player> 
    <EventStart>2014-05-10T00:00:00</EventStart> 
    </Event> 
</EventList> 

Aber würde raten Ihnen dringend Ihre Benutzer getrennt zu halten! Damit:

SELECT e.Id AS [@eventid] 
     ,e.Title 
     ,(
     SELECT u.UserID AS [@userid] 
       ,u.Username AS [@username] 
     FROM dbo.Users AS u 
     INNER JOIN dbo.UserEvents AS ue ON u.UserID=ue.UserID 
     WHERE e.Id=ue.EventID 
     FOR XML PATH('User'),TYPE 
    ) AS Player 
     ,e.EventStart 
FROM dbo.Events AS e 
FOR XML PATH('Event'),ROOT('EventList') 

... würden Sie dieses

<EventList> 
    <Event eventid="3409"> 
    <Title>Boxing Match</Title> 
    <Player> 
     <User userid="155" username="jweldz" /> 
     <User userid="218" username="pwarner" /> 
     <User userid="310" username="jeffrey" /> 
    </Player> 
    <EventStart>2014-05-10T00:00:00</EventStart> 
    </Event> 
</EventList> 
+0

Perfekt, danke! Ich hatte den JOIN an der falschen Stelle. +1 – Powellellogram

+0

@Powellellogram Ich habe meine Antwort bearbeitet. Wenn Sie Ihre Benutzer nicht trennen, ist es viel unwahrscheinlicher, userID und userName zusammen zu bekommen! – Shnugo

+0

danke, glücklich, guten Rat zu akzeptieren. Ich werde dein zweites Beispiel verwenden! – Powellellogram