2010-10-21 5 views
40

Je me demande comment puis-je lire une donnée XML et la transformer en une table dans TSQL?Convertir Xml en Table SQL Server

Par exemple:

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

Pour

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

Répondre

70

Ceci est la réponse, il aide quelqu'un espère :)

D'abord, ils sont deux variations sur la façon dont le code XML peut être écrit:

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

Réponse:

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

Réponse:

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) 

Extrait 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

Le transport de votre matériel d'origine est optimal. J'ai également trouvé que vous devez d'abord lire une chaîne XML de la base de données dans une variable avant de pouvoir la traiter. Il semble y avoir aucun moyen de 'SELECT FROM' une sous-requête qui retourne XML. – cjbarth

+1

Apparemment, j'ai parlé trop tôt. Cet article traite de la sélection de XML sans variable: http://stackoverflow.com/a/18361423/271351. Fondamentalement, vous «CROSS APPLY» la table avec le champ dans la table qui a le XML, puis tirez le «NODES» du champ «CROSS APPLY». – cjbarth

+0

ces commentaires me laisser à la réponse que j'ai lutté pendant des jours pour trouver. Merci!! – andrew

20

Utilisez sp_xml_preparedocument.

Pour plus de détails chèque: http://technet.microsoft.com/en-gb/library/ms186918.aspx

Quant à votre question:

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

Cela fonctionne bien. Encore mieux, vous pouvez utiliser une table existante pour définir le schéma dans le avec. –

0

Si vous avez profondément les documents XML imbriqués (ou JSON, HTML, SQL) avec des nœuds récursifs (nœud 'dossier' dans le noeud 'dossier' dans le noeud 'dossier') d'un type complexe mixte sans schéma XSD/DTD, vous pouvez utiliser l'outil eXtractorONE (eXtractor.ONE). Aucune programmation nécessaire, pas de Xquery, pas de XSLT, configuration presque nulle. Pas de limite de taille. Il suffit de pointer vers le dossier avec des documents XML, sélectionnez votre base de données cible et exécutez-le.

0

Pour accomplir cette tâche de conversion, vous pouvez utiliser un outil de conversion de mappage XML tel que XMLFox Advance. Nous utilisons le convertisseur XMLFox Advance depuis des années pour transformer les données XML des consommateurs en tables SQL Server.