2016-03-24 2 views
2

У меня есть 3 таблицы, и мне нужно, чтобы присоединиться к 3 таблице для того, чтобы создать вложенную XML-файлСоздания вложенного файла XML в SQL Server

Таблицы События, UserEvents и пользователи. Ниже приведен пример схемы: (! Или что-то вдоль этих линий)

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

С помощью этой схемы я хотел бы создать вложенную вывод XML в следующем формате в SQL Server 2014. Каждый пользователь в событии перечисляется Tag один Event:

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

Но вместо этого я получаю:

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

Событие повторяется каждый раз, когда появляется новый игрок, но это не идеально. Как я могу вложить игроков в один тег события с помощью SQL Server 2014?

+0

Большой вопрос! Пример кода, Fiddle, ожидаемый результат, фактический вывод. +1 с моей стороны – Shnugo

ответ

2

Этот запрос должен доставить, что вам нужно:

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

Результат

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

Но настоятельно советую вам держать пользователей разделены! При этом:

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

... вы получите эту

<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

Отлично, спасибо! У меня была ПРИСОЕДИНЕНИЕ в неправильном месте. +1 – Powellellogram

+0

@Powellellogram Я отредактировал свой ответ. Если вы не разделяете своих пользователей, гораздо более примитивно получить идентификатор пользователя и имя пользователя вместе! – Shnugo

+0

спасибо, рад принять хороший совет. Я буду использовать ваш второй пример! – Powellellogram