2016-04-28 6 views
0

私はXML要素内の値を変更する必要がある - この型なしバージョンでは、このように動作します:SQL Server:複雑なXML要素の値を変更することは可能ですか?

declare @X xml= 
'<translations> 
    <value lang="en-US">example</value> 
    <value lang="de-DE">Beispiel</value> 
</translations>'; 

set @X.modify('replace value of (/translations/value[@lang="en-US"]/text())[1] with "replacedValue"'); 

select @X.value('(/translations/value[@lang="en-US"])[1]','varchar(max)'); 

属性LANG = "EN-USと「値」要素の選択リターン「replacedValue」 "読みやすくするために

CREATE XML SCHEMA COLLECTION [dbo].[LocaleSchema] AS N'<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"><xsd:element name="translations"><xsd:complexType><xsd:complexContent><xsd:restriction base="xsd:anyType"><xsd:sequence minOccurs="0" maxOccurs="unbounded"><xsd:element name="value"><xsd:complexType><xsd:simpleContent><xsd:extension base="xsd:string"><xsd:attribute name="lang" type="language" /></xsd:extension></xsd:simpleContent></xsd:complexType></xsd:element></xsd:sequence></xsd:restriction></xsd:complexContent></xsd:complexType></xsd:element><xsd:simpleType name="language"><xsd:restriction base="xsd:string"><xsd:enumeration value="de-DE" /><xsd:enumeration value="en-US" /></xsd:restriction></xsd:simpleType></xsd:schema>' 

その後のみXMLスキーマはかなり印刷:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="translations"> 
     <xsd:complexType> 
      <xsd:complexContent> 
       <xsd:restriction base="xsd:anyType"> 
        <xsd:sequence minOccurs="0" maxOccurs="unbounded"> 
         <xsd:element name="value"> 
          <xsd:complexType> 
           <xsd:simpleContent> 
            <xsd:extension base="xsd:string"> 
             <xsd:attribute name="lang" type="language" /> 
            </xsd:extension> 
           </xsd:simpleContent> 
          </xsd:complexType> 
         </xsd:element> 
        </xsd:sequence> 
       </xsd:restriction> 
      </xsd:complexContent> 
     </xsd:complexType> 
    </xsd:element> 
    <xsd:simpleType name="language"> 
     <xsd:restriction base="xsd:string"> 
      <xsd:enumeration value="de-DE" /> 
      <xsd:enumeration value="en-US" /> 
     </xsd:restriction> 
    </xsd:simpleType> 
</xsd:schema> 

は、残念ながら、私は、次のXMLスキーマが入力され、データベース内のXML属性のためにこれをしなければなりません

「value」というXML要素は、複合型です。ドキュメントによると、modify()関数は単純型に対してのみ有効です。

declare @X xml (CONTENT [dbo].[LocaleSchema])= 
'<translations> 
    <value lang="en-US">example</value> 
    <value lang="de-DE">Beispiel</value> 
</translations>'; 

set @X.modify('replace value of (/translations/value[@lang="en-US"]/text())[1] with "replacedValue"'); 

があります:変更しようとするとエラーが発生する - だから、その後の型指定されたコンテンツの上からSQL文

(また、ほかのテキスト()関数は、単純型に対してのみ有効です)回避策?あるいは、XML属性を変更する他の可能性はありますか? (私は実際の生活の中でUPDATEステートメントでこれを使用する必要があります)

ありがとうございます!

+0

ストアリレーショナル形式の代わりに、XMLでデータ? – RichardCL

+0

XMLフィールドを型なしのXML変数に読み込み、変更してテーブルを更新しますか?これは、特にXMLインデックスを更新する必要がある場合は非常に非効率的です。 – RichardCL

答えて

1

これは動作します...

CREATE XML SCHEMA COLLECTION [dbo].[LocaleSchema] AS N'<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"><xsd:element name="translations"><xsd:complexType><xsd:complexContent><xsd:restriction base="xsd:anyType"><xsd:sequence minOccurs="0" maxOccurs="unbounded"><xsd:element name="value"><xsd:complexType><xsd:simpleContent><xsd:extension base="xsd:string"><xsd:attribute name="lang" type="language" /></xsd:extension></xsd:simpleContent></xsd:complexType></xsd:element></xsd:sequence></xsd:restriction></xsd:complexContent></xsd:complexType></xsd:element><xsd:simpleType name="language"><xsd:restriction base="xsd:string"><xsd:enumeration value="de-DE" /><xsd:enumeration value="en-US" /></xsd:restriction></xsd:simpleType></xsd:schema>'; 
GO 

declare @X xml (CONTENT [dbo].[LocaleSchema])= 
'<translations> 
    <value lang="en-US">example</value> 
    <value lang="de-DE">Beispiel</value> 
</translations>'; 

set @X.modify('replace value of (/translations/value[@lang="en-US"])[1] with "replacedValue"'); 

SELECT @x; 
GO 

--clean up 
--DROP XML SCHEMA COLLECTION dbo.LocaleSchema; 
+0

ありがとうShnugo!あなたは今日二度私を救った: – bert

+0

これを読んでうれしい!ハッピーコーディング! – Shnugo

関連する問題