Sostituisci il valore dell'elemento xml fortemente tipizzato in SQL Server con XQuery


10

Dato un elemento, definito all'interno di una raccolta di schemi XML in quanto tale:

<xsd:element name="xid">
    <xsd:simpleType>
        <xsd:restriction base="xsd:string">
            <xsd:maxLength value="32" />
        </xsd:restriction>
    </xsd:simpleType>
</xsd:element>

Come aggiorneresti l'elemento usando XQuery?

L'elemento si trova nello spazio dei nomi ns nella raccolta dello schema. Ho cercato di aggiornare l'elemento la query seguente:

update cm.item
   set data.modify(
    'declare namespace ns="http://www.anon.com"; 
     replace value of (/ns:*/ns:xid)[1] with "X00011793" cast as element(ns{http://www.anon.com}:xid,#anonymous) ?') 
 where id = 11793

ma questo genera il seguente errore:

Messaggio 9301, livello 16, stato 1, riga 2 XQuery [cm.item.data.modify ()]: in questa versione del server, "cast as" non è disponibile. Si prega di utilizzare il 'cast come?' sintassi.

Se rimuovo completamente il cast e utilizzo questa query:

update cm.item
   set data.modify(
    'declare namespace ns="http://www.anon.com"; 
     replace value of (/ns:*/ns:xid)[1] with "X00011793"') 
 where id = 11793

Ottengo questo errore:

Messaggio 2247, livello 16, stato 1, riga 2 XQuery [cm.item.data.modify ()]: il valore è di tipo "xs: string", che non è un sottotipo del tipo previsto "<anonimo>".

Se invio questa query:

update cm.item
   set data.modify(
      'declare namespace ns="http://www.anon.com/"; 
       replace value of (/ns:*/ns:xid/text())[1] with "X00011793"')
 where id = 11793

Ottengo questo errore:

Messaggio 9312, livello 16, stato 1, riga 2 XQuery [cm.item.data.modify ()]: 'text ()' non è supportato su un semplice tipo o ' http://www.w3.org/2001/XMLSchema #anyType 'elements, found' (element (ns { http://www.anon.com/ }: xid, # anonymous)?) * '.

Sto prendendo di mira SQL Server 2008 R2.

Grazie!

Risposte:


6

Non ho trovato un modo semplice per modificare semplicemente l' replace value ofaffermazione per lavorare con definizioni di tipo semplice anonime.

Semplice riproduzione di ciò che hai:

drop xml schema collection dbo.SimpleTypeTest;

go

create xml schema collection dbo.SimpleTypeTest as 
N'<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="xid">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:maxLength value="30"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>';

go

declare @X xml(document dbo.SimpleTypeTest) = '<root><xid>1</xid></root>';

set @X.modify('replace value of /root/xid  with "2"');

Risultato:

Messaggio 2247, livello 16, stato 1, riga 25 XQuery [modifica ()]: il valore è di tipo "xs: string", che non è un sottotipo del tipo previsto "<anonimo>".

Una soluzione alternativa consiste nel modificare lo schema per utilizzare un tipo semplice denominato xidTypee trasmettere il nuovo valore.

drop xml schema collection dbo.SimpleTypeTest;

go

create xml schema collection dbo.SimpleTypeTest as 
N'<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="xid" type="xidType"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:simpleType name="xidType">
        <xs:restriction base="xs:string">
            <xs:maxLength value="30"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>';

go

declare @X xml(document dbo.SimpleTypeTest) = '<root><xid>1</xid></root>';

set @X.modify('replace value of /root/xid  with "2" cast as xidType?');

Un altro modo è quello di estrarre l'XML in una variabile XML non tipizzata, modificare la variabile e rimetterla nella tabella.

drop xml schema collection dbo.SimpleTypeTest;

go

create xml schema collection dbo.SimpleTypeTest as 
N'<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="xid">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:maxLength value="30"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>';

go

declare @X xml(document dbo.SimpleTypeTest) = '<root><xid>1</xid></root>';
declare @X2 xml = @X;

set @X2.modify('replace value of (/root/xid/text())[1]  with "2"');
set @X = @X2;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.