6
votes

Mettre à jour le champ XML sans texte dans T-SQL

J'ai rencontré un problème dans la mise à jour d'un champ SQL dans ce que j'ai parfaitement écrit fonctionne parfaitement pour des nœuds XML avec un texte présent, mais il trébuche lorsque le nœud est vide.

UPDATE filemetaDB SET filemeta.modify('replace value of (/filemeta/description/text())[1] with "notworking!"');


0 commentaires

4 Réponses :


0
votes

Je pense que cette méthode ne fonctionnera pas pour les nœuds vides.
VOUS VÉRIFIEZ aussi VÉRIFIEZ CETTE THEAD: link


0 commentaires

1
votes

Vous pouvez vérifier si le nœud dispose de données avant de mettre à jour, tels que:

IF EXISTS(
            SELECT  null
            FROM    filemetaDB
            WHERE   cast(filemeta.query('if (/filemeta/description[1]) then "T" else ""') as varchar) = 'T')
    BEGIN
        UPDATE filemetaDB SET filemeta.modify('replace value of (/filemeta/description/text())[1] with "notworking!"');
    END


0 commentaires

11
votes

Ce nœud (/ filemeta / description / texte ()) [1] code> n'existe pas dans le XML donc il n'y a rien à remplacer. Vous devez faire une insertion à la place. Si vous avez un scénario où vous avez un mélange de nœuds et de nœuds vides avec une valeur, vous devez exécuter deux relevés de mise à jour.

filemeta
------------------------------------------------------
<filemeta><description>TEST 1</description></filemeta>
<filemeta><description>TEST 2</description></filemeta>
<filemeta />


7 commentaires

Comment utiliser la variable dans l'instruction insertion dans la méthode de modification?


@ Sikni8 envisager d'utiliser SQL: variable ("")


Essayé ceci: set @ xml.modifier ('Insérer xs: chaîne (SQL: variable ("@ locanor")) dans (/ root / startone / value6) [1]'); je continue à obtenir Une erreur: xquery [modifier ()]: seuls les nœuds non-documents peuvent être insérés. Trouvé "xs: string?".


@ Sikni8 Essayez ceci SET @ xml.modifier ('Insérer le texte {SQL: variable ("@ Locancher")} dans (/ root / startone / value6) [1]');


Extrêmement malheureux. :-) Est-ce toujours vrai en 2018 ou y a-t-il eu des améliorations? Je ne vois rien dans Le remplacer docs pour suggérer qu'il y a eu, mais ...


@ T.J.Crowder Il n'y a rien fait à ce sujet dans les versions ultérieures de SQL Server. Il fonctionne cependant si vous utilisez XML typé .


@MIKAELERIKSSON: Merci. (Je devrais vraiment.)



2
votes

J'ai eu un scénario où je voulais seulement mettre à jour les nœuds vides.

UPDATE filemetaDB SET filemeta.modify('
    insert text{"Oh, this works!!"}
    into (/filemeta/description[not(node()) and not(text())])[1]
');


1 commentaires

Très pratique, cela permet d'économiser la vérification de l'existence.