SELECT les valeurs de text de noeud à partir du document XML dans TSQL OPENXML

J'ai un document XML que je veux utiliser pour mettre à jour les valeurs dans une procédure stockée. Je peux traiter le XML en utilisant OPENXML, mais je suis confus à propos de l'extraction des valeurs que je veux. Chaque ligne du file xml est un logging de produit et je souhaite créer une variable pour chaque propriété. Cell0 est l'ID, la description Cell2, etc.

DECLARE @idoc int DECLARE @doc varchar(1000) SET @doc =' <products> <rows> <row> <cell>1</cell> <cell>BALSAMO DERMOSCENT</cell> <cell>1.00</cell> <cell>0.00</cell> <cell>18.00</cell> <cell>18.00</cell> <cell>8.00</cell> <cell>427</cell> <cell>No</cell> </row> <row> <cell>2</cell> <cell>BAYTRIL 150 MG 1 CPDO</cell> <cell>1.00</cell> <cell>0.00</cell> <cell>3.50</cell> <cell>3.50</cell> <cell>8.00</cell> <cell>57</cell> <cell>No</cell> </row> </rows> </products>' --Create an internal representation of the XML document. EXEC sp_xml_preparedocument @idoc OUTPUT, @doc -- Execute a SELECT statement that uses the OPENXML rowset provider. SELECT * FROM OPENXML (@idoc, '/products/rows/row/cell',1) with (Col1 varchar(29) 'text()') 

L'exécution de la requête ci-dessus renvoie 1 logging pour chaque CELL dans le file XML. Je veux être en mesure de returnner 1 logging par ligne avec des colonnes différentes pour chaque cellule, quelque chose comme: –

 Prod Description Qty ---------- -------------------- -------- 1 BALSAMO DERMOSCENT 1.00 2 BAYTRIL 150 MG 1 CPDO 1.00 

J'utilise MSSQL 2008

Je suis venu avec ce qui suit qui fait le travail pour moi

 DECLARE @idoc int DECLARE @doc varchar(1000) SET @doc =' <products> <rows> <row> <cell>1</cell> <cell>BALSAMO DERMOSCENT</cell> <cell>1.00</cell> <cell>0.00</cell> <cell>18.00</cell> <cell>18.00</cell> <cell>8.00</cell> <cell>427</cell> <cell>No</cell> </row> <row> <cell>2</cell> <cell>BAYTRIL 150 MG 1 CPDO</cell> <cell>1.00</cell> <cell>0.00</cell> <cell>3.50</cell> <cell>3.50</cell> <cell>8.00</cell> <cell>57</cell> <cell>No</cell> </row> </rows> </products>' --Create an internal representation of the XML document. EXEC sp_xml_preparedocument @idoc OUTPUT, @doc -- Execute a SELECT statement that uses the OPENXML rowset provider. SELECT * FROM OPENXML (@idoc, '/products/rows/row',1) with (pLineNo int 'cell[1]/text()', pDesc varchar(50) 'cell[2]/text()', pQty float 'cell[3]/text()', pCost float 'cell[4]/text()', pPvp float 'cell[5]/text()', pTotal float 'cell[6]/text()', pIva float 'cell[7]/text()', pId int 'cell[8]/text()', pnoFact varchar(5) 'cell[9]/text()') 

Pourquoi utiliser openxml sur sql server 2008?

C'est une meilleure option (j'ai utilisé varchar (max) comme type de données, mais saisissez tout ce qui est applicable). Notez que vous devez déclarer la variable comme xml, pas varchar.

 SELECT Row.Item.value('data(cell[1])', 'varchar(max)') As Prod, Row.Item.value('data(cell[2])', 'varchar(max)') As Description, Row.Item.value('data(cell[3])', 'varchar(max)') As Qty FROM @doc.nodes('//row') AS Row(Item) 

Remarque: Si vous utilisez une procédure stockée, vous devrez peut-être inclure les éléments suivants avant l'instruction select:

 SET ARITHABORT ON -- required for .nodes 

Si vous devez utiliser openxml, au less le nettoyer lorsque vous avez terminé:

 exec sp_xml_removedocument @idoc