我需要一個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語句中使用它)
預先感謝您!
存儲在關係格式,而不是XML數據? – RichardCL
將XML字段讀入一個無類型的XML變量,進行更改並更新表?這可能是非常低效的,特別是如果XML索引必須更新。 – RichardCL