none
Comportement surprenant dans une requête xml dml sur une table contrôlée par un schema xml RRS feed

  • Question

  • Bonjour,

    Je travaille avec un schéma xsd fournit par l'IEC www.iec.ch/(donc organisation internationale, utilisation mondiale, non modifiable).
    J'ai un bug(? feature?) qui tout simplement m'empêche de modifier quoi que ce soit en base.
    J'ai ultra simplifié la partie qui me chiffonne pour ma démo:

    (SQL SERVER 2008R2)

    if exists(select * from sys.xml_schema_collections where name = 'testXsd')
    drop xml schema collection testXsd
    go

    create xml schema collection testXsd as N'
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:attributeGroup name="ag1">
    <xs:attribute name="GUID" type="xs:string"/>
    </xs:attributeGroup>

    <xs:element name="Parent">
    <xs:complexType>
    <xs:sequence>
    <xs:element name="Children">
    <xs:complexType>
    <xs:sequence>
    <xs:element name="Child" type="tChild" minOccurs="0" maxOccurs="unbounded">
    </xs:element>
    </xs:sequence>
    </xs:complexType>
    </xs:element>
    </xs:sequence>
    </xs:complexType>
    </xs:element>

    <xs:complexType name="tChild">
    <xs:complexContent mixed="false">
    <xs:extension base="tBase">
    <xs:attribute name="name" use="required">
    <xs:simpleType>
    <xs:restriction base="xs:string">
    <xs:maxLength value="5"/>
    </xs:restriction>
    </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="surname" type="xs:string"/>
    </xs:extension>
    </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="tBase">
    <xs:sequence>
    <xs:any namespace="##other" processContents="lax"/>
    </xs:sequence>
    <xs:attributeGroup ref="ag1"/>
    <xs:anyAttribute namespace="##other" processContents="lax"/>
    </xs:complexType>
    </xs:schema>
    '
    go

    declare @xml xml (testXsd)
    set @xml = '
    <Parent xmlns:ext="http://tempuri.org/extra">
    <Children>
    <Child GUID="z" name="zzz">
    </Child>
    <Child GUID="x" name="me" surname="titi"/>
    <Child GUID="y" name="me2"/>
    </Children>
    </Parent>
    '

    set @xml.modify('
    replace value of (//Child[@GUID[string(.)="x"]]/@surname)[1]
    with "toto"
    ')

    select @xml

    go
    drop xml schema collection dbo.testXsd
    go

    La réponse de SQL SERVER est:

    Msg 9306, Level 16, State 1, Line 15
    XQuery [modify()]: The target of 'replace value of' cannot be a union type, found '(attribute(surname,xs:string) | attribute(surname,xs:anySimpleType)) ?'.

    après analyse il apparait que la ligne fautive est <xs:any namespace="##other" processContents="lax"/> qui est sensée autoriser l'ajout de balise personnalisée si elle appartient à un autre namespace, puisque sa suppression permet de réaliser l'opération. Hors si je comprend bien le message d'erreur, il semble que puisqu'on autorise une balise dans un autre namespace, ses attributs eux ne sont pas limités dans ce namespace d'où le type union pour le @surname qui pourtant est bien dans le namespace par défaut.

    Est-ce normal ? Y a t'il un workaround ?

    Merci de votre attention.

    vendredi 24 août 2012 07:14