2010-01-10 5 views
1

Je souhaite copier les valeurs d'un nœud vers un autre dans le serveur SQL (2005 et 2008). par exemple, si l'un des données XML est comme ci-dessousValeurs de copie xml SQL Server d'un nœud à l'autre

<Data> 
<Name></Name> 
<ShortName>Joe</ShortName> 
</Data> 

le xml résultant devrait être

<Data> 
<Name>Joe</Name> 
<ShortName>Joe</ShortName> 

la déclaration de mise à jour devrait affecter toutes les lignes de la table

apprécient toute aide merci

Répondre

2

Vous devez regarder pour Silent XQuery failures .

Le problème dans ce cas est que l'expression XPath (/ données/Nom/texte()) 1 retourne une séquence vide. 'Nom' est un élément vide (Il n'a pas d'enfants). Par conséquent, l'expression (/ Data/Name/text()) 1 ne pointe vers aucun noeud existant. La solution à ce problème consiste à insérer un nouveau nœud de texte dans l'élément Name, comme ceci:

DECLARE @myDoc xml 
SET @myDoc = '<Data> 
    <Name></Name> 
    <Name2>dd</Name2> 
    <ShortName>Joe</ShortName> 
</Data>' 

SELECT @myDoc 

if (@myDoc.exist('(/Data/Name/text())[1]') = 1) BEGIN 
    set @myDoc.modify(' 
     replace value of (/Data/Name/text())[1] 
     with (/Data/ShortName/text())[1] 
    ') 
end else begin 
    set @myDoc.modify(' 
     insert (/Data/ShortName/text())[1] 
     as first into (/Data/Name)[1] 
    ') 
end 

SELECT @myDoc 
+0

bon conseil. J'ai rencontré ce problème mais j'ai oublié de le mentionner dans le post. – user55474

+0

Je suis content que vous l'ayez attrapé. N'oubliez pas d'accepter cette réponse si vous l'avez trouvé utile. –

0

obtenu la solution table de mise à jour définie col.modify (valeur de remplacement (/ Nom/texte()) [1] avec (/ ShortName/texte()) [1])

+0

Une erreur est survenue dans votre solution. Voir ma réponse pour plus d'informations. –

Questions connexes