У меня есть очень большой набор данных xml, который структурирован следующим образом:
<root>
<person>
<personid>HH3269732</personid>
<firstname>John</firstname>
<lastname>Smith</lastname>
<entertime>01/02/2008 10:15</entertime>
<leavetime>01/02/2008 11:45</leavetime>
<entertime>03/01/2008 08:00</entertime>
<leavetime>03/01/2008 10:00</leavetime>
...
// number of enter times and leave times vary from person to person
// there may not be a final leave time (ie, they haven't left yet)
</person>
...
</root>
Структура данных не находится под моим контролем. Эти данные в настоящее время находятся в одном столбце xml в одной строке в MS SQL Server 2005. Я пытаюсь создать запрос, который приводит к следующему выводу:
HH3269732 John Smith 01/02/2008 10:15 01/02/2008 11:45
HH3269732 John Smith 03/01/2008 08:00 01/02/2008 10:00
HH3269735 Mark Pines 02/01/2008 09:00 NULL
HH3263562 James Frank NULL NULL
HH3264237 Harold White 04/18/2008 03:00 04/18/2008 05:00
...
Мой запрос в настоящее время выглядит следующим образом:
DECLARE @xml xml
SELECT @xml = XmlCol FROM Data
SELECT
[PersonId] = Persons.PersonCollection.value('(personid)[1]', 'NVARCHAR(50)')
,[First Name] = Persons.PersonCollection.value('(firstname)[1]', 'NVARCHAR(50)')
,[Last Name] = Persons.PersonCollection.value('(lastname)[1]', 'NVARCHAR(50)')
??????
FROM @xml.nodes('root\person') Persons(PersonCollection)
Этот запрос может быть не на 100% правильным, так как я вытаскиваю его из памяти, но проблема, с которой я столкнулся, заключается в том, что я не знаю, как включить элементы последовательности времени выхода entertime таким образом, чтобы получить желаемый набор строк, который я указал выше.
Спасибо.
UPDATE:
Я хотел добавить, что данная запись о человеке может вообще иметь элементы последовательности no entertime / lefttime, но все же должна быть возвращена в наборе строк. Я обновил пример желаемого результата, чтобы отразить это.