xml nodes () in t sql - соответствие родительских узлов атрибутам дочерних узлов - PullRequest
1 голос
/ 06 мая 2020

Я пытаюсь запросить следующую структуру xml:

<effect><![CDATA[<p>some text</p>]]>
  <product code="4298271" />
  <product code="4298273" />
  <product code="4298274" />
  <product code="4298275" />
  <product code="4298276" />
</effect>
<effect><![CDATA[<p>some other text</p>]]>
  <product code="5298271" />
  <product code="5298273" />
  <product code="5298274" />
  <product code="5298275" />
  <product code="5298276" />
</effect>

Мне нужно преобразовать эти данные в таблицу, как показано ниже:

Effect   ProductCode

some text       4298271
some text       4298273
some text       4298274
...
...

Возможно ли это? Я могу получить список строк продукта, которые находятся под каждым родительским эффектом, но не знаю, как сопоставить его с заголовком эффекта, из которого следует запросить текст.

Допустим, эффект - это root узел для упрощения.

1 Ответ

1 голос
/ 06 мая 2020

Несмотря на то, что XML на самом деле не является действительным документом - вы все равно можете запросить его в T- SQL с помощью XQuery - примерно так:

DECLARE @input XML = '<effect><![CDATA[<p>some text</p>]]>
  <product code="4298271" />
  <product code="4298273" />
  <product code="4298274" />
  <product code="4298275" />
  <product code="4298276" />
</effect>
<effect><![CDATA[<p>some other text</p>]]>
  <product code="5298271" />
  <product code="5298273" />
  <product code="5298274" />
  <product code="5298275" />
  <product code="5298276" />
</effect>'

SELECT
    xc.value('(../text())[1]', 'varchar(50)'),
    xc.value('(@code)[1]', 'int')
FROM
    @input.nodes('/effect/product') AS XT(XC)

Это дает результат:

enter image description here

При необходимости отрегулируйте ....

...