2010-10-21 2 views
40

Интересно, как я могу прочитать XML-данные и преобразовать их в таблицу в TSQL?Преобразование Xml в таблицу SQL Server

Например:

<row> 
    <IdInvernadero>8</IdInvernadero> 
    <IdProducto>3</IdProducto> 
    <IdCaracteristica1>8</IdCaracteristica1> 
    <IdCaracteristica2>8</IdCaracteristica2> 
    <Cantidad>25</Cantidad> 
    <Folio>4568457</Folio> 
</row> 
<row> 
    <IdInvernadero>3</IdInvernadero> 
    <IdProducto>3</IdProducto> 
    <IdCaracteristica1>1</IdCaracteristica1> 
    <IdCaracteristica2>2</IdCaracteristica2> 
    <Cantidad>72</Cantidad> 
    <Folio>4568457</Folio> 
</row>  

К

8 3 8 8 25 4568457 
3 3 1 2 72 4568457 

ответ

70

Это ответ, надеюсь, это поможет кому-то :)

Во-первых, они являются две вариации, как XML может быть начертано:

<row> 
    <IdInvernadero>8</IdInvernadero> 
    <IdProducto>3</IdProducto> 
    <IdCaracteristica1>8</IdCaracteristica1> 
    <IdCaracteristica2>8</IdCaracteristica2> 
    <Cantidad>25</Cantidad> 
    <Folio>4568457</Folio> 
</row> 
<row> 
    <IdInvernadero>3</IdInvernadero> 
    <IdProducto>3</IdProducto> 
    <IdCaracteristica1>1</IdCaracteristica1> 
    <IdCaracteristica2>2</IdCaracteristica2> 
    <Cantidad>72</Cantidad> 
    <Folio>4568457</Folio> 
</row> 

Ответ:

SELECT 
     Tbl.Col.value('IdInvernadero[1]', 'smallint'), 
     Tbl.Col.value('IdProducto[1]', 'smallint'), 
     Tbl.Col.value('IdCaracteristica1[1]', 'smallint'), 
     Tbl.Col.value('IdCaracteristica2[1]', 'smallint'), 
     Tbl.Col.value('Cantidad[1]', 'int'), 
     Tbl.Col.value('Folio[1]', 'varchar(7)') 
FROM @xml.nodes('//row') Tbl(Col) 

2.

<row IdInvernadero="8" IdProducto="3" IdCaracteristica1="8" IdCaracteristica2="8" Cantidad ="25" Folio="4568457" />       
<row IdInvernadero="3" IdProducto="3" IdCaracteristica1="1" IdCaracteristica2="2" Cantidad ="72" Folio="4568457" /> 

Ответ:

SELECT 
     Tbl.Col.value('@IdInvernadero', 'smallint'), 
     Tbl.Col.value('@IdProducto', 'smallint'), 
     Tbl.Col.value('@IdCaracteristica1', 'smallint'), 
     Tbl.Col.value('@IdCaracteristica2', 'smallint'), 
     Tbl.Col.value('@Cantidad', 'int'), 
     Tbl.Col.value('@Folio', 'varchar(7)') 

FROM @xml.nodes('//row') Tbl(Col) 

Взято из:

  1. http://kennyshu.blogspot.com/2007/12/convert-xml-file-to-table-in-sql-2005.html

  2. http://msdn.microsoft.com/en-us/library/ms345117(SQL.90).aspx

+0

В том числе ваш исходный материал отличный. Я также обнаружил, что вам сначала нужно прочитать XML-строку из базы данных в переменную, прежде чем вы сможете ее обработать. Кажется, нет никакого способа «SELECT FROM» в подзапросе, который возвращает XML. – cjbarth

+1

Видимо, я говорил слишком рано. В этом сообщении описывается, как выбрать XML без переменной: http://stackoverflow.com/a/18361423/271351. В основном вы «CROSS APPLY» столбец с полем в таблице, в котором есть XML, а затем вытащите «NODES» из поля «CROSS APPLY». – cjbarth

+0

эти комментарии позволяют мне ответить, что я много дней пытался найти. Благодаря!! – andrew

20

Использование sp_xml_preparedocument.

Для детальной проверки: http://technet.microsoft.com/en-gb/library/ms186918.aspx

Что касается Вашего вопроса:

DECLARE @XML XML 
SET @XML = '<rows><row> 
    <IdInvernadero>8</IdInvernadero> 
    <IdProducto>3</IdProducto> 
    <IdCaracteristica1>8</IdCaracteristica1> 
    <IdCaracteristica2>8</IdCaracteristica2> 
    <Cantidad>25</Cantidad> 
    <Folio>4568457</Folio> 
</row> 
<row> 
    <IdInvernadero>3</IdInvernadero> 
    <IdProducto>3</IdProducto> 
    <IdCaracteristica1>1</IdCaracteristica1> 
    <IdCaracteristica2>2</IdCaracteristica2> 
    <Cantidad>72</Cantidad> 
    <Folio>4568457</Folio> 
</row></rows>' 

DECLARE @handle INT 
DECLARE @PrepareXmlStatus INT 

EXEC @PrepareXmlStatus= sp_xml_preparedocument @handle OUTPUT, @XML 

SELECT * 
FROM OPENXML(@handle, '/rows/row', 2) 
    WITH (
    IdInvernadero INT, 
    IdProducto INT, 
    IdCaracteristica1 INT, 
    IdCaracteristica2 INT, 
    Cantidad INT, 
    Folio INT 
    ) 


EXEC sp_xml_removedocument @handle 
+1

Это хорошо работает. Еще лучше, если вы можете использовать существующую таблицу для определения схемы в с. –

0

Если у вас есть глубоко вложенные XML-документы (или JSON, HTML SQL) с рекурсивными узлов (узел 'папка' в узле «папка» в папке «node») смешанного сложного типа без схемы XSD/DTD вы можете использовать инструмент eXtractorONE (eXtractor.ONE). Не требуется программирования, нет Xquery, нет XSLT, почти нулевая конфигурация. Без ограничений по размеру. Просто укажите папку с документами XML, выберите свою целевую базу данных и запустите ее.

0

Для выполнения такой задачи преобразования вы можете использовать инструмент преобразования XML-преобразования, например XMLFox Advance. Мы используем конвертер XMLFox Advance в течение многих лет для преобразования данных XML-пользователей в таблицы SQL-сервера.

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