2010-10-21 15 views
40

Mi chiedo come posso leggere un dato xml e trasformarlo in una tabella in TSQL?Converti Xml in SQL Server di tabella

Ad esempio:

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

Per

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

risposta

70

Questa è la risposta, spero che aiuta qualcuno :)

Prima sono due variazioni su come l'XML può essere scritto:

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

Risposta:

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

Risposta:

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) 

Tratto da:

  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

L'inclusione del materiale sorgente è ottima. Ho anche scoperto che devi prima leggere una stringa XML dal DB in una variabile prima di poterla elaborare. Sembra che non ci sia alcun modo per 'SELECT FROM' una subquery che restituisce XML. – cjbarth

+1

A quanto pare ho parlato troppo presto. Questo post illustra come selezionare XML senza una variabile: http://stackoverflow.com/a/18361423/271351. Fondamentalmente si 'CROSS APPLY' la tabella con il campo nella tabella che ha l'XML e poi si tira' NODES' dal campo 'CROSS APPLY'ed. – cjbarth

+0

questi commenti mi hanno lasciato alla risposta che ho faticato per giorni a trovare. Grazie!! – andrew

20

Usa sp_xml_preparedocument.

Per i dettagli di controllo: http://technet.microsoft.com/en-gb/library/ms186918.aspx

Per quanto riguarda la tua domanda:

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

Funziona bene. Ancora meglio è possibile utilizzare una tabella esistente per definire lo schema nel. –

0

Se si dispone di documenti profondamente nidificate XML (o JSON, html, SQL) con nodi ricorsive (nodo 'cartella' nel nodo 'cartella' nel nodo 'cartella') di un tipo complesso misto senza uno schema XSD/DTD è possibile utilizzare lo strumento eXtractorONE (eXtractor.ONE). Nessuna programmazione necessaria, nessuna Xquery, nessuna XSLT, quasi zero configurazione. Nessun limite di dimensioni. Basta puntare alla cartella con i documenti XML, selezionare il database di destinazione ed eseguirlo.

0

Per eseguire tale attività di conversione, è possibile utilizzare uno strumento di conversione della mappatura XML come XMLFox Advance. Da anni utilizziamo il convertitore XMLFox Advance per trasformare i dati XML dei consumatori in tabelle del server SQL.

Problemi correlati