Как сделать SQL таблицу из XML файла, которая будет иметь динамическое количество узлов?

Я использую SQL Server 2008.
Задача: взять XML файл и разобрать его в(n) SQL таблицу.
Проблема: количество столбцов и их имена будут варьироваться в зависимости от XML.

Вот некоторый код:

DECLARE @xmlData XML;  
SET @xmlData = '<root>
  <item id="1">
    <item_number>IT23</item_number>
    <title>Item number twenty-three</title>
    <setting>5 to 20</setting>
    <parameter>10 to 16</parameter>
  </item>
  <item id="2">
    <item_number>RJ12</item_number>
     <title>Another item with a 12</title>
     <setting>7 to 35</setting>
     <parameter>1 to 34</parameter>
  </item>
  <item id="3">
     <item_number>LN90</item_number>
     <title>LN with 90</title>
     <setting>3 to 35</setting>
     <parameter>9 to 50</parameter>
  </item>
</root>'

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

table snapshot

Вот как я получил приведенную выше таблицу:

   DECLARE @idoc INT;
   EXEC sp_xml_preparedocument @idoc OUTPUT, @xmlData

   SELECT * 
   FROM  OPENXML (@idoc, '/root/item', 2)
   WITH (item_number VARCHAR(100),
         title VARCHAR(100),
         setting VARCHAR(100),
         parameter VARCHAR(100))

Теперь предположим, что XML изменился, и каждый узел элемента имеет новый дочерний узел с именем 'new_node'. Например, так:

<root>
  <item id="1">
    <item_number>IT23</item_number>
    <title>Item number twenty-three</title>
    <setting>5 to 20</setting>
    <parameter>10 to 16</parameter>
    <new_node>data</new_node>
  </item>
  <item id="2">
    <item_number>RJ12</item_number>
    <title>Another item with a 12</title>
    <setting>7 to 35</setting>
    <parameter>1 to 34</parameter>
    <new_node>goes</new_node>
  </item>
  <item id="3">
    <item_number>LN90</item_number>
    <title>LN with 90</title>
    <setting>3 to 35</setting>
    <parameter>9 to 50</parameter>
    <new_node>here</new_node>
  </item>
</root>

Я должен изменить свой код, чтобы включить новый узел:

   SELECT * 
   FROM  OPENXML (@idoc, '/root/item', 2)
   WITH (item_number VARCHAR(100),
         title VARCHAR(100),
         setting VARCHAR(100),
         parameter VARCHAR(100),
         new_node VARCHAR(100))

Чтобы получить эту таблицу:

second table from XML

Итак, проблема в том, что дочерние узлы 'item' будут разными.

Как я могу сгенерировать те же таблицы, не указывая столбцы? Есть ли какой-то другой подход, кроме использования OPENXML?

8
задан Brian Tompsett - 汤莱恩 27 July 2017 в 15:47
поделиться