SQL Серверный синтаксический анализ XML в таблицу - несколько узлов с тем же именем и первым узлом должны быть столбцами таблицы - PullRequest
1 голос
/ 11 июля 2020

У меня есть источник xml, как показано ниже, и я хочу преобразовать его в SQL таблицу. Первый узел "tr" должен быть столбцами для таблицы, а остальные - строками.

<table>
      <tbody>
      <tr>
        <td>Description</td>
        <td>Value</td>
        <td>Reference</td>
        <td>Category</td>
        <td>Review</td>
      </tr>
      <tr>
        <td>Process Param</td>
        <td>|ABCD|</td>
        <td>Step1</td>
        <td>Process</td>
        <td>False</td>
      </tr>
      <tr>
        <td>Config Param</td>
        <td>|EFGH|</td>
        <td>Step2</td>
        <td>Config</td>
        <td>True</td>
      </tr>
      <tr>
        <td>Process Param</td>
        <td>|IJKL|</td>
        <td>Step3</td>
        <td>Process</td>
        <td>False</td>
      </tr>
    </tbody>
  </table>

Ожидаемый SQL вывод: Вывод

1 Ответ

0 голосов
/ 11 июля 2020

Вы можете извлечь данные из своей структуры html / xml, используя метод nodes, предусмотренный для типа данных xml (подробнее здесь ).

Вот простой запрос, который должен направить вас на верный путь:

select 
     Tbl.Col.value('td[1]', 'varchar(50)')  
    ,Tbl.Col.value('td[2]', 'varchar(50)')  
    ,Tbl.Col.value('td[3]', 'varchar(50)')  
    ,Tbl.Col.value('td[4]', 'varchar(50)')  
    ,Tbl.Col.value('td[5]', 'varchar(50)')  
from @x.nodes('//tr') Tbl(Col)  

где @x - это переменная xml, содержащая ваш xml:

declare @x xml = '<table>...

Проблема в том, что первая строка (содержащая заголовки столбцов) возвращается внутри набора данных:

введите описание изображения здесь

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

...