2010-12-14 43 views
2

J'essaie d'utiliser XQuery dans SQL Server 2005 pour mettre à jour le xml enregistré dans une colonne. Voici un exemple des données que je dois mettre à jour. J'ai besoin de définir la zone et le volume à des valeurs d'une table différente. Je crée un CTE pour la mise à jour. Il y a une autre logique que j'ai omis, mais je l'ai vérifié que le CTE contient les données correctes pour la mise à jour:Utilisation de Xquery pour remplacer une valeur de noeud xsi: nil = "true"

;with Volume (DocumentID, Volume) As 
(
    Select DocumentID, Volume from tbl 
) 

et je l'utilise XQuery SQL suivante pour essayer de mettre à jour la table.

UPDATE tbl_Archive 
    SET XML.modify(' declare namespace x="http://www.redacted.com"; 
    replace value of (/x:Document/x:Volume/text())[1] 
    with sql:column("Volume.Volume")') 
    From Volume where volume.documentID = tbl_Archive.DocumentID 

je reçois 1 ligne affectée, mais quand je regarde le XML, il n'a pas changé, et je ne peux pas comprendre ce qui doit être fixé pour le faire fonctionner. Le noeud est non typé, si cela fait une différence.

Répondre

4

La mise à jour ne fonctionnera pas s'il n'y a pas de texte à remplacer .. le XPath /x:Document/x:Volume/text())[1] retournera un jeu vide.

insert Try ...

UPDATE tbl_Archive 
    SET XML.modify(' declare namespace x="http://www.redacted.com"; 
    insert text {sql:column("Volume.Volume")} 
    as first into (/x:Document/x:Volume)[1]') 
    From Volume where volume.documentID = tbl_Archive.DocumentID 

..you'll alors besoin de supprimer l'attribut nil="true" ..

Quelque chose comme ça peut-être ..

update tbl_Archive set XML.modify('delete /*:Document/*:Volume[text()]/@xsi:nil') 
+0

Eh oui, cela ne il. Merci! –