2010-04-21 8 views
0

This site a une technique pour transmettre des données XML dans Microsoft SQL Server:données xml Microsoft SQL Server

DECLARE @productIds xml 
SET @productIds ='<Products><id>3</id><id>6</id><id>15</id></Products>' 

SELECT 
ParamValues.ID.value('.','VARCHAR(20)') 
FROM @productIds.nodes('/Products/id') as ParamValues(ID) 

Mais quelle est la syntaxe si j'ajouter un autre champ? Ce qui suit ne fonctionne pas:

DECLARE @productIds xml 
SET @productIds ='<Products><id>3</id><descr>Three</descr><id>6</id><descr>six</descr><id>15</id><descr>Fifteen</descr></Products>' 

SELECT 
ParamValues.ID.value('.','VARCHAR(20)') 
,ParamValues.descr.value('.','VARCHAR(20)') 
FROM @productIds.nodes('/Products/id') as ParamValues(ID) 

Note: Peut-être que je l'ai construit mon xml mal.

Répondre

3

Vous devez utiliser quelque chose comme:

SELECT 
    ParamValues.ID.value('(id)[1]','VARCHAR(20)'), 
    ParamValues.ID.value('(descr)[1]','VARCHAR(20)') 
FROM 
    @productIds.nodes('/Products') as ParamValues(ID) 

Ce FROM il définit quelque chose comme une « table virtuelle » appelé ParamValues.ID - vous devez sélectionner le nœud <Products> dans cette table virtuelle, puis accéder aux propriétés à l'intérieur il.

En outre, votre structure XML est très mal choisi:

<Products> 
    <id>3</id> 
    <descr>Three</descr> 
    <id>6</id> 
    <descr>six</descr> 
    <id>15</id> 
    <descr>Fifteen</descr> 
</Products> 

Vous ne pourrez sélectionner les différentes paires de id/descr - vous devez utiliser quelque chose comme:

<Products> 
    <Product> 
     <id>3</id> 
     <descr>Three</descr> 
    </Product> 
    <Product> 
     <id>6</id> 
     <descr>six</descr> 
    </Product> 
    <Product> 
     <id>15</id> 
     <descr>Fifteen</descr> 
    </Product> 
</Products> 

Ensuite, vous pouvez récupérer tous les éléments à l'aide de cette requête SQL XML:

SELECT 
    ParamValues.ID.value('(id)[1]','VARCHAR(20)') AS 'ID', 
    ParamValues.ID.value('(descr)[1]','VARCHAR(20)') AS 'Description' 
FROM 
    @productIds.nodes('/Products/Product') as ParamValues(ID) 

ID Descrition 
3  Three 
6  six 
15  Fifteen 
1

vous devez envelopper chaque ensemble de id et descr en un nœud parent. Dites Ligne. Maintenant, vous pouvez accéder à chaque paire comme ça.

DECLARE @productIds xml 
SET @productIds ='<Products><Row><id>3</id><descr>Three</descr></Row><Row><id>6</id><descr>six</descr></Row><Row><id>15</id><descr>Fifteen</descr></Row></Products>' 

SELECT 
ParamValues.Row.query('id').value('.','VARCHAR(20)'), 
ParamValues.Row.query('descr').value('.','VARCHAR(20)') 
FROM @productIds.nodes('/Products/Row') as ParamValues(Row) 
Questions connexes