2010-07-16 3 views
3

Je lis une pléthore d'articles en ce moment pour essayer de m'aider .. il semble juste tellement d'options et ne peut pas sembler trouver une solution propre .. c'est probablement très basique donc excuses à l'avance!insérer un noeud dans SQL 2008 xml type de données ... vérifier s'il existe d'abord

J'ai donc un champ XML dans SQL 2008. Il contient essentiellement quelque chose comme:

<root><id>1</id><id>4</id></root> et ainsi de suite ...

Ce que j'espère faire est de passer un à un dans param proc insérer une valeur si elle n'existe pas ..

Donc, plutôt que de lire le xml d'abord et de le faire dans le code. NET, y at-il une façon propre de le faire dans un proc/t-sql stocké ???

Toute aide appréciée! Je suis sûr que c'est un assez commun!

Répondre

1

Un exemple en utilisant la méthode value():

DECLARE 
    @x xml, 
    @param int 

SET @x = '<root><id>1</id><id>2</id><id>3</id></root>' 
SET @param = 1 

IF NOT EXISTS (
    SELECT * FROM @x.nodes('/root/id') n(x) WHERE x.value('.','int') = @param 
) 
PRINT 'Insert' 
ELSE 
PRINT 'Return' 
+0

Wow, vraiment d'excellentes réponses claires .. merci !! juste un coup d'oeil maintenant .. mais merci beaucoup d'avoir pris le temps de répondre! –

+0

Espérons que l'un de ces travaux. Note rapide: édité EXISTS à NOT EXISTS ... – 8kb

1

Vous pouvez utiliser la fonction .exist() XQuery sur votre XML pour savoir si un noeud donné existe ou non.

Découvrez An Overview of XML Support in SQL Server 2005 - c'est un excellent article sur l'utilisation des diverses fonctions XQuery disponibles. Juste après le milieu de cette page, vous trouverez cette section:

Utilisation du existe Méthode

La méthode exist prend une XPath expression qui sélectionne un seul noeud dans le document XML, et renvoie soit Vrai (valeur de bit 1) si le nœud existe, soit Faux (valeur de bit 0) si ce n'est pas . Si la colonne source est une colonne xml (dans ce cas vous doit déclarer l'espace de noms dans votre requête ), et l'élément contient null, la méthode renvoie NULL à la place. Alors XQuery:

SELECT MyXml.exist('(/root/product[@id="304"])[1]' FROM MyTable 

retourne vrai s'il y a un produit avec la valeur id "304" (un élément produit avec l'attribut id = "304"), ou faux si non. Vous pouvez également utiliser la méthode existe la clause WHERE d'une instruction SQL :

SELECT column1, column2, column3 FROM MyTable 
WHERE MyXml.exist('(/root/product[@id="304"])[1]') = 1 
+0

Merci! comme mentionné à l'autre réponse, merci beaucoup pour une réponse aussi complète. Va vérifier dans les réponses maintenant et répondre. Merci!!! –

Questions connexes