2010-11-11 23 views
0
declare @myDoc xml 
set @myDoc = '<Form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.mydomain.org/MySchema.xsd" SectionId="ABCD" Description="Some stuff"> 
<ProductDescription ProductID="1" ProductName="Road Bike"> 
<Features> 
    <Warranty>1 year parts and labor</Warranty> 
    <Maintenance>3 year parts and labor extended maintenance is available</Maintenance> 
</Features> 
</ProductDescription> 
</Form>' 

;WITH XMLNAMESPACES( 'http://www.w3.org/2001/XMLSchema-instance' as xsi, 'http://www.w3.org/2001/XMLSchema' as xsd, DEFAULT 'http://www.mydomain.org/MySchema.xsd') 
SELECT @myDoc.value('/Form[@SectionId][0]', 'varchar') 

J'ai besoin d'obtenir la valeur d'attribut de SectionId en tant que nvarchar? Comment puis-je le fais ...Requête XML DML pour l'attribut

T et R Mark

Répondre

1

Vous pourriez écrire encore plus simple:

;WITH XMLNAMESPACES(DEFAULT 'http://www.mydomain.org/MySchema.xsd') 
SELECT @myDoc.value('(/Form/@SectionId)[1]', 'VARCHAR(100)') AS SectionId 

Puisque vous ne jamais utiliser/se référant à l'une des les espaces de noms xsi ou xsd, il n'est pas nécessaire de les déclarer.

Et puisque vous ne récupérez qu'un seul attribut d'un élément, il n'y a aucun intérêt à utiliser la fonction .nodes() pour créer une "table fictive" interne.

+0

Merci marc, mais je n'ajoute pas les espaces de noms, le producteur du xml le fait, je dois les conserver car le SELECT renvoie NULL sans eux. Le vrai xml est en fait stocké dans une colonne xml non typée et non dans une variable de type xml. J'utilise .nodes() car je ne peux pas garantir qu'il n'y en aura qu'une seule. Mais je vois votre point. –

0
;WITH XMLNAMESPACES( 'http://www.w3.org/2001/XMLSchema-instance' as xsi, 'http://www.w3.org/2001/XMLSchema' as xsd, DEFAULT 'http://www.mydomain.org/MySchema.xsd') 
SELECT Node.value('@SectionId', 'VARCHAR(100)') AS SectionId 
FROM @myDoc.nodes('/Form') TempXML (Node);