Converter Xml para servidor de tabela SQL

pergunto-me como posso ler um dado xml e transformá-lo numa tabela em TSQL?

por exemplo:

<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>      

a

8   3   8   8   25  4568457
3   3   1   2   72  4568457
Author: Luke Girvin, 2010-10-21

4 answers

Esta é a resposta, espero que ajude alguém.

Primeiro são duas variações sobre como o xml pode ser escrito:

1

<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>

Resposta:

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" />

Resposta:

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)

Retirado de:

  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

 75
Author: Sanchitos, 2010-10-21 16:03:33

Utilizar sp_xml_preparedocument.

Para verificação dos detalhes: http://technet.microsoft.com/en-gb/library/ms186918.aspx

Quanto à sua pergunta:
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 
 23
Author: xiaoyifang, 2013-08-22 10:27:14

Se tiver documentos XML profundamente aninhados (ou JSON, html, SQL) com nós recursivos (nó 'pasta' no nó 'pasta' no nó 'pasta' no nó 'pasta') de um tipo complexo misto sem um esquema XSD/DTD, poderá usar a ferramenta eXtractorONE (eXtractor.UM). Sem programação necessária, sem Xquery, sem XSLT, quase nenhuma configuração. Sem limite de tamanho. Basta apontar para a pasta com documentos XML, selecione o seu banco de dados alvo e executá-lo.

 0
Author: eXtractorONE, 2016-07-28 09:51:49

Para realizar essa tarefa de conversão, poderá considerar usar alguma ferramenta de conversão de mapeamento XML, como XMLFox Advance . Temos usado o Conversor XMLFox Advance há anos para transformar os dados XML do consumidor em tabelas de servidores SQL.

 0
Author: XMLStick, 2017-03-27 15:34:38