2010-10-21 13 views
40

Me pregunto cómo puedo leer un dato xml y transformarlo a una tabla en TSQL?Convierta Xml en Tablero Servidor SQL

Por ejemplo:

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

Para

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

Respuesta

70

Esta es la respuesta, espero que ayude a alguien :)

En primer lugar se trata de dos variantes de cómo el XML se puede escribió:

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

Respuesta:

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

Respuesta:

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) 

Tomado 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

+0

Incluyendo su fuente de material es excelente. También descubrí que primero tiene que leer una cadena XML del DB en una variable antes de poder procesarla. Parece que no hay forma de 'SELECCIONAR' una subconsulta que devuelve XML. – cjbarth

+1

Aparentemente hablé demasiado pronto. Esta publicación cubre cómo seleccionar XML sin una variable: http://stackoverflow.com/a/18361423/271351. Básicamente usted 'CROSS APLICAR' la tabla con el campo en la tabla que tiene el XML y luego sacar los 'NODES' del campo' CROSS APPLY'ed. – cjbarth

+0

estos comentarios me permiten la respuesta que tuve problemas durante días para encontrarla. ¡¡Gracias!! – andrew

20

Uso sp_xml_preparedocument.

Para la comprobación detalle: http://technet.microsoft.com/en-gb/library/ms186918.aspx

cuanto a su pregunta:

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

Esto funciona bien. Aún mejor es que puede usar una tabla existente para definir el esquema en with. –

0

Si tiene documentos anidadas XML (o JSON, HTML, SQL) con nodos recursivas (nodo 'carpeta' en el nodo 'carpeta' en el nodo 'carpeta') de un tipo mixto complejo sin un esquema XSD/DTD puede usar la herramienta eXtractorONE (eXtractor.ONE). No se necesita programación, no Xquery, no XSLT, configuración casi cero. Sin límite de tamaño Simplemente señale la carpeta con documentos XML, seleccione su base de datos de destino y ejecútela.

0

Para llevar a cabo dicha tarea de conversión puede considerar utilizar alguna herramienta de conversión de mapas XML como XMLFox Advance. Hemos estado utilizando el convertidor XMLFox Advance durante años para transformar los datos XML de los consumidores en tablas de SQL server.