Dado um elemento, definido dentro de uma coleção 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>
Como você atualizaria o elemento usando XQuery?
O elemento é encontrado no namespace ns na coleção de esquemas. Eu tenho tentado atualizar o elemento da consulta abaixo:
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
mas isso gera o seguinte erro:
Msg 9301, Nível 16, Estado 1, Linha 2 XQuery [cm.item.data.modify()]: Nesta versão do servidor, 'cast as' não está disponível. Por favor, use o 'transmitir como?' sintaxe.
Se eu remover totalmente o elenco e usar 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
Eu recebo este erro:
Msg 2247, Nível 16, Estado 1, Linha 2 XQuery [cm.item.data.modify()]: O valor é do tipo "xs:string", que não é um subtipo do tipo esperado "<anônimo>".
Se eu emitir 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
Eu recebo este erro:
Msg 9312, Nível 16, Estado 1, Linha 2 XQuery [cm.item.data.modify()]: 'text()' não é compatível com digitação simples ou ' http://www.w3.org/2001/XMLSchema #anyType 'elements, found'(element(ns{ http://www.anon.com/ }:xid,#anonymous) ?) *'.
Estou visando o SQL Server 2008 R2.
Obrigado!
Não encontrei uma maneira simples de apenas modificar a
replace value of
instrução para trabalhar com definições de tipo simples anônimas.Reprodução simples do que você tem:
Resultado:
Uma solução alternativa é modificar seu esquema para usar um tipo simples nomeado
xidType
e converter o novo valor.Outra maneira é extrair o XML para uma variável XML sem tipo, modificar a variável e colocá-la de volta na tabela.