#sql-server #xml #tsql #sql-server-2008 #nodes
#sql-сервер #xml #tsql #sql-server-2008 #узлы
Вопрос:
Возможно ли это в TSQL?
Я загружаю эту структуру с помощью параметра xml. И мне нужно установить его во временную таблицу.
DECLARE @xml xml
SET @xml = '<Events>
<Event id="8">
<Responses>
<Response id="59">
<Loe>
<Id>89</Id>
</Loe>
</Response>
<Response id="60">
<Loe>
<Id>89</Id>
<Id>90</Id>
<Id>88</Id>
<Id>87</Id>
</Loe>
</Response>
</Responses>
</Event>
</Events>';
Пытаюсь отобразить его как:
EventId ResponseId LoeId
8 59 89
8 60 89
8 60 90
8 60 88
8 60 87
Я пытался использовать этот запрос, но он выдает ошибку.
SELECT
[data].value('../../@id','varchar(100)') AS EventId,
[data].value('@id','varchar(100)') AS ResponseId,
[data].value('Loe/Id','varchar(100)') AS LoeId
FROM @xml.nodes('/Events/Event/Responses/Response') as Test([data])
Но если я удалю LoeId, это сработает, и я получу это:
EventId ResponseId
8 59
8 60
Что я делаю не так? Как мне обратиться к Loe-> Id в запросе?
Я использую MSSQL 2008. У вас есть какие-нибудь идеи?
Спасибо.
Ответ №1:
это должно сделать это:
SELECT
event.value('@id', 'int') AS Event,
response.value('@id','int') AS Response,
id.value('.','int') AS LoeId
FROM
@xml.nodes('Events/Event') AS t1(event) cross apply
t1.event.nodes('Responses/Response') AS t2(response) cross apply
t2.response.nodes('Loe/Id') AS t3(id)
ORDER BY Event, Response, LoeId
Комментарии:
1. данные вашего предыдущего примера содержали несколько узлов событий, так что они также обрабатываются
2. @K Ivanov Большое вам спасибо. Я был так близко, и в то же время так далеко! Потрясающий ответ и я очень признателен. Это действительно прояснило ситуацию для меня.