2016-06-27 2 views
1

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

<table> 
    <id>{100}</id> 
    <rows> 
    <row> 
     <columns> 
     <column name="cur" value="EUR" type="System.String" /> 
     <column name="item" value="Item a" type="System.String" /> 
     <column name="price" value="2.5" type="System.Decimal" /> 
     <column name="qty" value="20" type="System.Int32" /> 
     <column name="Key" value="1" type="System.Int32" /> 
     </columns> 
    </row> 
    <row> 
     <columns> 
     <column name="cur" value="EUR" type="System.String" /> 
     <column name="item" value="Item b" type="System.String" /> 
     <column name="price" value="30" type="System.Decimal" /> 
     <column name="qty" value="30" type="System.Int32" /> 
     <column name="Key" value="2" type="System.Int32" /> 
     </columns> 
    </row> 
    </rows> 
    <key>Key</key> 
</table> 

Я хотел бы результат, чтобы выглядеть следующим образом:

id key cur item price qty 
100 1 EUR Item a 2.5 20 
100 2 EUR Item b 30  30 

Я надеюсь, что кто-то может мне помочь.

+0

'метод nodes' из' типа данных xml' является то, что вы ищете. https://msdn.microsoft.com/en-us/library/ms188282.aspx –

ответ

0

Попробуйте так:

DECLARE @x XML= 
'<table> 
    <id>{100}</id> 
    <rows> 
    <row> 
     <columns> 
     <column name="cur" value="EUR" type="System.String" /> 
     <column name="item" value="Item a" type="System.String" /> 
     <column name="price" value="2.5" type="System.Decimal" /> 
     <column name="qty" value="20" type="System.Int32" /> 
     <column name="Key" value="1" type="System.Int32" /> 
     </columns> 
    </row> 
    <row> 
     <columns> 
     <column name="cur" value="EUR" type="System.String" /> 
     <column name="item" value="Item b" type="System.String" /> 
     <column name="price" value="30" type="System.Decimal" /> 
     <column name="qty" value="30" type="System.Int32" /> 
     <column name="Key" value="2" type="System.Int32" /> 
     </columns> 
    </row> 
    </rows> 
    <key>Key</key> 
</table>'; 
SELECT @x.value('(/table/id)[1]','varchar(max)') AS id --are the curly brackets there on purpose? 
     ,Rw.value('(columns/column[@name="Key"]/@value)[1]','int') AS [key] 
     ,Rw.value('(columns/column[@name="cur"]/@value)[1]','varchar(max)') AS cur 
     ,Rw.value('(columns/column[@name="item"]/@value)[1]','varchar(max)') AS item 
     ,Rw.value('(columns/column[@name="price"]/@value)[1]','decimal(10,4)') AS price 
     ,Rw.value('(columns/column[@name="qty"]/@value)[1]','int') AS qty 
FROM @x.nodes('/table/rows/row') AS A(Rw) 
+0

Спасибо! Это сработало. PS. Кудрявые скобки помещаются туда системой, генерирующей xml, не знаю почему. – Sabine

Смежные вопросы