Запрос XML данных на SQL сервере - PullRequest
0 голосов
/ 06 января 2020

Я относительно новичок на SQL сервере. В настоящее время я работаю с таблицей, в которой есть столбец XML, и я хочу извлечь значения из этого столбца. Я пробовал несколько способов совместного использования в Stackoverflow, но ни один из них, похоже, не работает для меня. Не могли бы вы, ребята, помочь мне с решением?

Версия БД: Microsoft SQL Сервер 2014 (SP3)

Пример данных:

<r>
    <SerialisedEvent>
        BEGIN:VEVENT
        ATTENDEE:mailto:3ab162bc-4721-4fc2-94da-86aee8ee79e6
        DESCRIPTION:Review status of infection
        DTEND:20190701T180000
        DTSTAMP:20190624T140113
        DTSTART:20190701T080000
        LOCATION:
        SEQUENCE:0
        UID:08376c46-7fae-4073-b41e-03cb4cdbb008
        END:VEVENT
    </SerialisedEvent>
</r>
<r>
    <SerialisedEvent>
        BEGIN:VEVENT
        ATTENDEE:mailto:3ab162bc-4721-4fc2-94da-86aee8ee79e6
        DESCRIPTION:Review status of infection
        DTEND:20191025T180000
        DTSTAMP:20191018T102124
        DTSTART:20191025T080000
        LOCATION:
        SEQUENCE:0
        UID:ccdf6200-097a-401f-997b-7fb6aa170cdb
        END:VEVENT
    </SerialisedEvent>
</r>

Желаемый вывод:

 BEGIN | ATTENDEE | DESCRIPTION | DTEND ....

Заранее спасибо.

1 Ответ

0 голосов
/ 06 января 2020

не очень чистый (или безопасный), но выполнимый

declare @x xml = N'<r>
    <SerialisedEvent>
        BEGIN:VEVENT1
        ATTENDEE:mailto:3ab162bc-4721-4fc2-94da-86aee8ee79eA
        DESCRIPTION:Review status of infection 1
        DTEND:20190701T180000
        DTSTAMP:20190624T140113
        DTSTART:20190701T080000
        LOCATION:
        SEQUENCE:0
        UID:08376c46-7fae-4073-b41e-03cb4cdbb008
        END:VEVENT1
    </SerialisedEvent>
</r>
<r>
    <SerialisedEvent>
        BEGIN:VEVENT2
        ATTENDEE:mailto:3ab162bc-4721-4fc2-94da-86aee8ee79eB
        DESCRIPTION:Review status of infection 2
        DTEND:20191025T180000
        DTSTAMP:20191018T102124
        DTSTART:20191025T080000
        LOCATION:
        SEQUENCE:0
        UID:ccdf6200-097a-401f-997b-7fb6aa170cdb
        END:VEVENT2
    </SerialisedEvent>
</r>'

select @x


select *
from
(
select rownum, 
    e.el, substring(t.textvalue, charindex(e.el, t.textvalue)+len(e.el)+1, charindex(char(10), t.textvalue, charindex(e.el, t.textvalue))-charindex(e.el, t.textvalue)-len(e.el)-1) as thevalue
from
(
select 
    replace(n.e.value('./text()[1]', 'varchar(8000)'), char(13), char(10)) as textvalue, 
    row_number() over(order by (select null)) as rownum
from @x.nodes('r/SerialisedEvent') as n(e)
) as t
cross apply (values('BEGIN'),('ATTENDEE'), ('DESCRIPTION'), ('DTSTAMP'), /*(...)*/ ('UID')) as e(el)
) as src
pivot
(
max(thevalue) for el in ([BEGIN], [ATTENDEE], [DESCRIPTION], [DTSTAMP], /*(...)*/ [UID])
) as unp;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...