Reemplace el valor del elemento xml fuertemente tipado en SQL Server con XQuery


10

Dado un elemento, definido dentro de una Colección de Esquema XML como tal:

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

¿Cómo actualizarías el elemento usando XQuery?

El elemento se encuentra dentro del espacio de nombres ns en la colección de esquemas. He estado tratando de actualizar el elemento de la consulta a continuación:

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

pero esto genera el siguiente error:

Mensaje 9301, Nivel 16, Estado 1, Línea 2 XQuery [cm.item.data.modify ()]: en esta versión del servidor, 'transmitir como' no está disponible. Por favor, use el 'elenco como?' sintaxis.

Si elimino el elenco por completo y uso esta consulta:

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

Me sale este error:

Mensaje 2247, Nivel 16, Estado 1, Línea 2 XQuery [cm.item.data.modify ()]: El valor es del tipo "xs: string", que no es un subtipo del tipo esperado "<anónimo>".

Si publico esta consulta:

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

Me sale este error:

Msg 9312, Nivel 16, Estado 1, Línea 2 XQuery [cm.item.data.modify ()]: 'text ()' no es compatible con mecanografía simple o ' http://www.w3.org/2001/XMLSchema #anyType 'elementos, encontrados' (elemento (ns { http://www.anon.com/ }: xid, # anónimo)?) * '.

Estoy apuntando a SQL Server 2008 R2.

¡Gracias!

Respuestas:


6

No he encontrado una manera simple de modificar la replace value ofdeclaración para que funcione con definiciones de tipo simple anónimas.

Reproducción simple de lo que tienes:

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"');

Resultado:

Mensaje 2247, Nivel 16, Estado 1, Línea 25 XQuery [modificar ()]: El valor es del tipo "xs: string", que no es un subtipo del tipo esperado "<anónimo>".

Una solución alternativa es modificar su esquema para usar un tipo simple con nombre xidTypey emitir el nuevo valor.

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?');

Otra forma es extraer el XML a una variable XML sin tipo, modificar la variable y volver a colocarla en la tabla.

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;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.