El uso de XQuery para reemplazar un valor de nodo que es xsi: nil = “true”
-
10-10-2019 - |
Pregunta
Estoy tratando de utilizar XQuery en SQL Server 2005 para la actualización XML guardado en una columna. Este es un ejemplo de los datos que necesito para actualización.
<Length>3</Length>
<Width>5</Width>
<Depth>6</Depth>
<Area xsi:nil="true" />
<Volume xsi:nil="true" />
necesito para establecer el área y el volumen de valores de una tabla diferente. Estoy creando un CTE para la actualización. Hay otra lógica que he omitido, pero he comprobado que el CTE contiene los datos correctos para la actualización:
;with Volume (DocumentID, Volume) As
(
Select DocumentID, Volume from tbl
)
y estoy usando la siguiente sentencia XQuery SQL para tratar de actualizar la tabla.
UPDATE tbl_Archive
SET XML.modify(' declare namespace x="http://www.redacted.com";
replace value of (/x:Document/x:Volume/text())[1]
with sql:column("Volume.Volume")')
From Volume where volume.documentID = tbl_Archive.DocumentID
recibo 1 fila afectada, pero cuando miro el XML no ha cambiado, y no puedo averiguar lo que necesita ser arreglado para hacer que funcione. El nodo no tiene tipo, si hay alguna diferencia.
Solución
Actualizar no funcionará si no hay texto para reemplazar el .. /x:Document/x:Volume/text())[1]
XPath devolverá un conjunto vacío.
Trate de inserción ...
UPDATE tbl_Archive
SET XML.modify(' declare namespace x="http://www.redacted.com";
insert text {sql:column("Volume.Volume")}
as first into (/x:Document/x:Volume)[1]')
From Volume where volume.documentID = tbl_Archive.DocumentID
.. A continuación, tendrá que quitar el atributo nil="true"
..
Algo como esto tal vez ..
update tbl_Archive set XML.modify('delete /*:Document/*:Volume[text()]/@xsi:nil')