2016-04-28 67 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」 」。

不幸的是我不得不爲這類型在數據庫中的XML屬性,它下面的XML架構做到這一點:

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> 

正如你在這裏看到的,「value」XML元素是一個複雜類型。根據文檔,modify()函數僅適用於簡單類型。 (除了還文本()函數只適用於簡單類型)

所以後來從上面的SQL語句的類型化的內容 - 這會導致試圖修改時一個錯誤:

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"'); 

是否有建議解決?或者是否有其他可能性來更改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