2008-10-05 11 views

Respuesta

34

Para nada real, me gustaría ir con XPaths, pero a veces sólo necesito una solución rápida y sucia:

Puede utilizar CAST para convertir esa columna XML en un varchar regular, y luego hacer tu reemplazo normal.

UPDATE xmlTable SET xmlCol = REPLACE(CAST(xmlCol as varchar(max)), '[search]', '[replace]')

Esa misma técnica también hace que la búsqueda XML fácil cuando se necesita simplemente ejecutar una consulta rápida de encontrar algo, y no quiere tratar con XPaths.

SELECT * FROM xmlTable WHERE CAST(xmlCol as varchar(max)) LIKE '%found it!%'

Editar: Sólo desea actualizar esto un poco, si recibe un mensaje en la línea de conversión de uno o más caracteres de XML para dirigirse a colación imposible, a continuación, sólo tiene que utilizar nvarchar que admite unicode.

CAST(xmlCol as nvarchar(max))

+0

ja, eso es un pequeño programa brillante :-) –

+0

@ Cory-Mawhorter Usted ha mencionado XPath sería "mejor". ¿Cómo usaría XPath para cambiar algo en la columna XML? –

+0

@ArminderDahul Ha pasado un tiempo, pero creo que puedes hacerlo como 'set xmlCol.nodes ('/ somenode/someothernode [@ id = sql: variable (" @ somevar ")]/text') = 'blah'' . No es seguro. La respuesta de Michael puede ayudarte a comenzar. –

15

Para buscar un contenido en una columna XML, busque en el método existir(), como se describe en MSDN here.

SELECT * FROM Table 
WHERE XMLColumn.exist('/Root/MyElement') = 1 

... para reemplazar, utilice el método de modificación(), como se describe here.

SET XMLColumn.modify(' 
    replace value of (/Root/MyElement/text())[1] 
    with "new value" 
') 

.all asumiendo SqlServer 2005 o 2008. Esto se basa en XPath, que usted necesita saber.

-5
update my_table 
set xml_column = replace(xml_column, "old value", "new value") 
+4

"Argumento tipo de datos XML no es válido para el argumento 1 de reemplazar fuction" –