Извлечение текстовых значений из XML в SQL - PullRequest
1 голос
/ 29 мая 2019

Я работаю с данными SQL, размещенными сторонними разработчиками, и пытаюсь получить определенную информацию для отчетов. Однако кое-что из того, что мне нужно разобрать, находится в формате XML, и я застреваю. Я ищу синтаксис для получения текста = значения только из кода XML.

Я считаю, что код должен выглядеть примерно так, но большинство примеров, которые я могу найти в Интернете, включают более простую иерархию XML, чем то, с чем я имею дело.

<[columnnameXML].value('(/RelatedValueListBO/Items/RelatedValueListBOItem/text())[1]','varchar(max)')>

Не в состоянии получить какие-либо результаты. Я также попытался объявить пробелы, но опять же ... Я получаю только значения NULL.

Пример XML, с которым я имею дело:

<RelatedValueListBO xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                    xmlns="http://tempuri.org/RelatedValueListBOSchema.xsd">
    <Items>
        <RelatedValueListBOItem groupKey="Response1" text="Response1" selected="true" />
        <RelatedValueListBOItem groupKey="Response2" text="Response2" selected="true" />
        <RelatedValueListBOItem groupKey="Response3" text="Response3" selected="true" />
    </Items>
</RelatedValueListBO>

В идеале я хотел бы получить ответ1; response2; response3 в один столбец. Принимая во внимание тот факт, что несколько ответов могут существовать. Я полагаю, что я застрял с основным кодом, который я пробовал, из-за пространств имен, связанных с RelatedValueListBO, и того факта, что то, что я хочу, сгруппировано в groupKey, text и selected, вместо значения, которое я хочу, просто находиться под Узел товаров.

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

У вас есть пространства имен, определенные в вашем XML, поэтому вам нужно определить их и в XQuery.
Быстрый и грязный метод - заменить все пространства имен на "*":

SELECT @x.value('(/*:RelatedValueListBO/*:Items/*:RelatedValueListBOItem/@text)[1]','varchar(max)')

Чтобы получить все ответы в одном столбце, вы можете использовать:


SELECT 
 Item.Col.value('./@text','varchar(max)') X
FROM @x.nodes('/*:RelatedValueListBO/*:Items/*:RelatedValueListBOItem') AS Item(Col)

Если вам нужна более высокая производительность, вам может потребоваться правильно определить пространства имен.

0 голосов
/ 29 мая 2019

Вы можете использовать что-то вроде этого для извлечения значения "text" в первом узле RelatedValueListBOItem

SELECT  extractvalue(value(rs), '//RelatedValueListBOItem[1]/@text')
  FROM TABLE (xmlsequence(extract(sys.xmltype('<RelatedValueListBO>
      <Items>
        <RelatedValueListBOItem groupKey="Response1" text="Response1" 
    selected="true" />
    <RelatedValueListBOItem groupKey="Response2" text="Response2" 
    selected="true" />
    <RelatedValueListBOItem groupKey="Response3" text="Response3" 
    selected="true" />
     </Items>
    </RelatedValueListBO>'),'/RelatedValueListBO/Items'))) rs;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...