Вопрос по запросу TSQL XML

#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 Большое вам спасибо. Я был так близко, и в то же время так далеко! Потрясающий ответ и я очень признателен. Это действительно прояснило ситуацию для меня.