2010-04-09 8 views
2

Comment copier des données d'attribut à un nouvel attribut dans la même colonne sqlcomment copier la valeur d'attribut dans un nouvel attribut

données originales

<root> 
<child attr='hello'></child> 
</root> 

Résultat 1

<root> 
<child attr='hello' attr2='hello'></child> 
</root> 

Résultat 2 (avec une modification)

<root> 
<child attr='hello' attr2='**H**ello **W**orld'></child> 
</root> 

Je veux faire ce que par SQL XML XQuery

+0

Je ne veux pas utiliser xslt –

Répondre

0

En supposant que nous pouvons utiliser XSLT, je le ferais comme ceci:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:output method="xml" indent="yes" omit-xml-declaration="no" /> 

    <xsl:template match="root"> 
     <xsl:copy> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="child"> 
     <xsl:copy> 
      <xsl:copy-of select="@*"/> 
      <xsl:attribute name="attr2"> 
       <xsl:value-of select="@attr"/> 
      </xsl:attribute> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

Ou, si vous voulez la modification Résultat 2, remplacer <xsl:template match="child"> ce qui suit:

<xsl:template match="child"> 
    <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     <xsl:attribute name="attr2"> 
      <xsl:value-of> 
       <xsl:text>**H**ello **W**orld</xsl:text> 
      </xsl:value-of> 
     </xsl:attribute> 
    </xsl:copy> 
</xsl:template> 
+0

Je veux faire cela uniquement via SQL XML Xquery –

1

Je ne suis pas sûr que je suis ce que vous vouloir exactement dans le deuxième résultat, mais je vais prendre un coup de poignard à: le premier exemple ci-dessous produirait votre résultat # 1 (J'ai mis ton ou données iginal dans test.xml et pris en charge dans vos données réelles que « enfant » et « attr ») peuvent être répétés:

<root>{ 
    for $child in doc('test.xml')/root/* 
    return 
    element {name($child)} { 
     for $attr at $index in $child/@* 
     return (
     attribute {name($attr)} {$attr}, 
     attribute {concat(name($attr), 2)} {$attr} 
    ) 
    } 
}</root> 

Il pourrait être modifié pour mettre une valeur différente, comme dans le résultat # 2, comme le ci-dessous:

<root>{ 
    for $child in doc('test.xml')/root/* 
    return 
    element {name($child)} { 
     for $attr at $index in $child/@* 
     return (
     attribute {name($attr)} {$attr}, 
     attribute {concat(name($attr), 2)} { 
      '**H**ello **W**orld' 
     } 
    ) 
    } 
}</root> 

Espérons que cela aide.

+0

Je veux faire cela uniquement via SQL XML Xquery –

0
DECLARE @xmlData table (
    data xml 
    ) 


INSERT INTO @xmlData(data) 
VALUES ('<root> 
    <child attr="hello"></child> 
    </root>') 

.modify() effectue toutes les opérations

UPDATE @xmlData 
SET data.modify('insert (attribute attr2 {"hello"}) into (/root/child)[1]') 

Vérifiez que les données sont correctes

SELECT * 
FROM @xmlData 


UPDATE @xmlData 
SET data.modify('replace value of (/root/child/@attr2)[1] with "**H**ello **W**orld" ') 

vérifier que les données sont correctes

SELECT * 
FROM @xmlData 

enter image description here

Questions connexes