1
好日子,TSQL XML修改錯誤與XSD
下面的測試工作:
DECLARE @XmlTest TABLE
(ID int,
MyContent Xml
)
declare @aaa XML
set @aaa = '<Root><MyNode Qualifier="0" Code="AAA" Deleted="true">9.99</MyNode><MyNode Qualifier="0" Code="AAA" Deleted="false">10.99</MyNode></Root>'
insert into @XmlTest (ID, MyContent)
values(1,@aaa)
set @aaa = '<Root><MyNode Qualifier="0" Code="BBB" Deleted="false">9.99</MyNode></Root>'
insert into @XmlTest (ID, MyContent)
values(2,@aaa)
select * from @XmlTest
- 節點選擇[@編號= 「AAA」,並@刪除= 「假」]是獨特的,所以我想能夠在邏輯上「刪除它」
UPDATE @XmlTest
SET MyContent.modify('replace value of (/Root/MyNode[@Code="AAA" and @Deleted="false"]/@Deleted)[1] with true()')
WHERE ID = 1
select * from @XmlTest
但是,使用XSD,它不起作用。我有一個錯誤消息,如
消息2234,Niveau 16,第1部分,Ligne 19 XQuery [@ XmlTest.MyContent.modify()]:運算符「=」不能應用於「」和「xs:string」
這裏的架構和
DECLARE @XmlTest TABLE
(ID int,
MyContent Xml(CONTENT TestSchema)
)
DROP XML SCHEMA COLLECTION TestSchema
create xml schema collection TestSchema as
'<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xs:simpleType name="AmountType">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="9999999999"/>
<xs:fractionDigits value="2"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="Root" sql:is-constant="1">
<xs:complexType>
<xs:sequence>
<xs:element name="MyNode" maxOccurs="unbounded" minOccurs="1" sql:is-constant="1">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="AmountType">
<xs:attribute name="Qualifier" use="required">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="Code" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="15"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="Deleted" use="required">
<xs:simpleType>
<xs:restriction base="xs:boolean">
<xs:pattern value="true"/>
<xs:pattern value="false"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>'
我想這個修改我的表的新的聲明,但如果失敗,以同樣的方式:
<xs:attribute type="xs:boolean" name="Deleted" use="required" />
在此先感謝
感謝Mikael的回覆。我認爲我誤導了自己的限制「真」或「假」(不想接受0或1)。只有當我刪除XSD中的限制(並且我不混合類型)時,您的解決方案才能正常工作。 – 2013-03-09 22:59:01
@DenisGilbert如果你只想要「true」和「false」,你應該使用xs:string作爲基礎。但是,我認爲你必須在比較和分配中使用一個字符串。也就是說,你需要用'true''將true()'改成'' – 2013-03-09 23:06:29