2010-09-13 8 views
3

J'essaie d'interroger une valeur particulière dans un champ XML. J'ai vu beaucoup d'exemples, mais ils ne semblent pas être ce que je suis à la rechercheSQL Server 2005 - Recherche de valeur dans le champ XML

Supposant mon champ xml est appelé XMLATTRIBUTES et table TableName, et la valeur xml complète est comme ci-dessous:

<Attribute name="First2Digits" value="12" /> 
<Attribute name="PurchaseXXXUniqueID" value="U4RV123456762MBE79" /> 

(bien que le champ XML fréquemment aura d'autres attributs, non seulement PurchaseXXXUniqueID)

Si je suis à la recherche d'une valeur spécifique dans le nom de l'attribut PurchaseXXXUniqueID - dire U4RV123456762MBE79 - comment pourrais-je écrire la requête? Je crois que ce serait quelque chose comme:

select * 
    from TableName 
where XMLAttributes.value('(/path/to/tag)[1]', 'varchar(100)') = '5FTZP2QT8Z3E2MAV2D' 

... mais il est le chemin/vers/tag que je dois comprendre.

Ou probablement il y a d'autres façons d'obtenir les valeurs que je veux.

Pour résumer - J'ai besoin d'obtenir tous les enregistrements dans une table où la valeur d'un attribut particulier dans le champ xml correspond à une valeur que je vais passer à la requête.

merci pour l'aide! Edit: J'essayais de rendre cela plus simple, mais au cas où cela ferait une différence - en fin de compte, j'aurai une table temporaire d'environ 50 valeurs potentielles pour le champ PurchaseXXXUniqueID. Pour cela, je veux obtenir tous les enregistrements correspondants de la table avec le champ XML.

Répondre

1

Cela devrait fonctionner:

SELECT 
    (fields from base table), 
    Nodes.Attr.value('(@name)[1]', 'varchar(100)'), 
    Nodes.Attr.value('(@value)[1]', 'varchar(100)') 
FROM 
    dbo.TableName 
CROSS APPLY 
    XMLAttributes.nodes('/Attribute') AS Nodes(Attr) 
WHERE 
    Nodes.Attr.value('(@name)[1]', 'varchar(100)') = 'PurchaseXXXUniqueID' 
    AND Nodes.Attr.value('(@value)[1]', 'varchar(100)') = 'U4RV123456762MBE79' 

Vous devez essentiellement joindre la ligne de table de base contre une « pseudo-ligne » pour chacun des <Attribute> noeuds dans la colonne XML, et à choisir les valeurs d'attribut individuelles du noeud <Attribute> pour sélectionner ce que vous recherchez.

+0

Cela l'a fait - merci! C'était très lent, cependant. Non que la lenteur des performances soit un problème avec votre requête, c'est juste que ces tables ne sont pas configurées pour les requêtes XML. Si j'avais toute une liste d'identifiants que je veux trouver - les mettrait dans une table temporaire, et les joignant quelque chose comme ça: – Sylvia

+0

sur Nodes.Attr.value ('(@ value) [1]', 'varchar (100) ') = # tempTable.UniqueID ...... – Sylvia

+0

être le moyen de le faire (désolé, le cr/lf a fini par être de nouvelles entrées) – Sylvia

0

Quelque chose comme ça?

declare @PurchaseXXXUniqueID varchar(max) 
set @PurchaseXXXUniqueID = 'U4RV123456762MBE79'; 

select * from TableName t 
where XMLAttributes.exist('//Attribute/@value = sql:variable("@PurchaseXXXUniqueID")') = 1 
+0

Merci pour la réponse. Je n'ai pas pu obtenir quelque chose de similaire à cela en SQL 2005 - est-ce que cela utilise la syntaxe spécifique de 2008? – Sylvia

+0

Eh bien, la seule différence est dans l'instruction 'declare'. Il suffit de séparer la partie de déclaration de la partie d'affectation. –

+0

Je l'ai fait, et il fonctionne sans erreurs ... mais il ne semble pas réellement filtrer seulement les valeurs que je veux. Je reçois toutes les valeurs. – Sylvia