2013-03-09 59 views
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" /> 

在此先感謝

回答

1

更改刪除定義

<xs:attribute type="xs:boolean" name="Deleted" use="required" /> 

我不知道你爲什麼會想這樣做的另一種方式。

查詢仍然不起作用的原因是因爲您正在比較布爾型@Deleted與字符串"false"。改爲使用false()

replace value of (/Root/MyNode[@Code="AAA" and @Deleted=false()]/@Deleted)[1] 
with true() 
+0

感謝Mikael的回覆。我認爲我誤導了自己的限制「真」或「假」(不想接受0或1)。只有當我刪除XSD中的限制(並且我不混合類型)時,您的解決方案才能正常工作。 – 2013-03-09 22:59:01

+0

@DenisGilbert如果你只想要「true」和「false」,你應該使用xs:string作爲基礎。但是,我認爲你必須在比較和分配中使用一個字符串。也就是說,你需要用'true''將true()'改成'' – 2013-03-09 23:06:29