Это просто, просто используйте вспомогательный выбор и действуйте так, как если бы это был * обычный столбец:
Этот простой SELECT
вернет единственный <FILEINFO>
SELECT 'P' AS [FILEINFO/SOURCE_ID]
FOR XML PATH(''),ROOT('ROOT');
Вы видите, что я использовал пустой PATH()
, но я установил ROOT()
.
Это результат
<ROOT>
<FILEINFO>
<SOURCE_ID>P</SOURCE_ID>
</FILEINFO>
</ROOT>
Теперь мы можем начать добавлять ваши события. Сначала мне нужно таблица макетов для имитации вашей проблемы
DECLARE @mockupEventTable TABLE(ID INT IDENTITY,[NO] INT, [DATE] DATETIME, EventText VARCHAR(100));
INSERT INTO @mockupEventTable VALUES(1,'20190916','Event 1')
,(2,'20190917','Event 2');
- Запрос
SELECT 'P' AS [FILEINFO/SOURCE_ID]
,(
SELECT e.[DATE]
,e.[NO]
,e.EventText
,'Doe' AS [CREW/LASTNAME]
FROM @mockupEventTable e
FOR XML PATH('EVENT'),TYPE
) AS [*]
FOR XML PATH(''),ROOT('ROOT');
Результат
<ROOT>
<FILEINFO>
<SOURCE_ID>P</SOURCE_ID>
</FILEINFO>
<EVENT>
<DATE>2019-09-16T00:00:00</DATE>
<NO>1</NO>
<EventText>Event 1</EventText>
<CREW>
<LASTNAME>Doe</LASTNAME>
</CREW>
</EVENT>
<EVENT>
<DATE>2019-09-17T00:00:00</DATE>
<NO>2</NO>
<EventText>Event 2</EventText>
<CREW>
<LASTNAME>Doe</LASTNAME>
</CREW>
</EVENT>
</ROOT>
ВыМожно увидеть, что суб-выбор создаст внутренний XML, как вам нужно. Мы должны указать ,TYPE
, чтобы получить это как напечатанный XML. Попробуйте то же самое без. Вы получите XML экранированный , как если бы это был простой текст ...
И я указываю AS [*]
(то же самое было AS [node()]
), чтобы указать, что столбец "XML""не имеет собственного имени, но должен быть вставлен как . Это не обязательно (попробуйте без), но это делает вещи более читабельными ...