1

良い一日、

次のテストが機能しています。

    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

-ノード選択[@Code="AAA"および@Deleted= "false"]は一意なので、論理的に「削除」できるようにしたい

    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では機能しません。次のようなエラーメッセージが表示されます

Msg 2234、Niveau 16、État1、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" />

前もって感謝します

4

1 に答える 1

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()
于 2013-03-09T22:05:54.407 に答える