在SQL Server中创建嵌套XML文件
我有3个表,为了创建嵌套的XML文件,我需要连接这3个表 这些表是Events、UserEvents和Users。下面是一个示例模式:在SQL Server中创建嵌套XML文件,sql,sql-server,xml,nested,sqlxml,Sql,Sql Server,Xml,Nested,Sqlxml,我有3个表,为了创建嵌套的XML文件,我需要连接这3个表 这些表是Events、UserEvents和Users。下面是一个示例模式: create table [dbo].[Users] ( UserID int, Username VARCHAR(MAX) ); insert into [dbo].[Users] (UserID, Username) values (155, 'jweldz'), (218, 'pwarner'), (310, 'jeffrey') cre
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 Server 2014中创建以下格式的嵌套XML输出(或类似的格式!)。事件中的每个用户都列在一个事件标记中:
<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>
拳击比赛
155
jweldz
218
普瓦纳
310
杰弗里
2016-04-16T09:00:00
但我得到的却是:
<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>
....
拳击比赛
155
jweldz
2016-04-16T09:00:00
拳击比赛
218
普瓦纳
2016-04-16T09:00:00
....
每次有新玩家时,该活动都会重复,但这并不理想。如何使用SQL Server 2014将玩家嵌套在一个事件标记中?此查询应提供您所需的内容:
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>
。。。你会得到这个
<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>
拳击比赛
2014-05-10T00:00:00
好问题!示例代码,Fiddle,预期输出,实际输出+我的朋友,谢谢!我在错误的地方加入了+1@Powellellogram我编辑了我的答案。如果你不分开你的用户,那么把userID和userName放在一起就更麻烦了!谢谢,很乐意接受好的建议。我将用你的第二个例子!
<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>