2008-10-05 9 views

risposta

34

Per qualcosa di reale, mi piacerebbe andare con XPaths, ma a volte basta una soluzione rapida e sporca:

È possibile utilizzare CAST per trasformare quella colonna XML in un varchar regolare, e poi fare la tua sostituzione normale.

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

Quella stessa tecnica rende anche la ricerca XML un gioco da ragazzi, quando è necessario eseguire solo una query rapido per trovare qualcosa, e non si vuole affrontare XPaths.

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

Edit: Giusto desidera aggiornare questo un po ', se si ottiene un messaggio lungo le linee di Conversione di uno o più caratteri da XML a bersaglio collazione impossibile, solo allora è necessario utilizzare nvarchar che supporta l'unicode.

CAST(xmlCol as nvarchar(max))

+0

hah, che è un piccolo hack geniale :-) –

+0

@ Cory-Mawhorter Lei ha parlato di XPath sarebbe "migliore". Come useresti XPath per cambiare qualcosa nella colonna XML? –

+0

@ArminderDahul È passato un po 'di tempo ma penso che si possa fare come 'set xmlCol.nodes ('/somenode/someothernode [@ id = sql: variable (" @ somevar ")]/text ') =' blah'' . Non sono sicuro. La risposta di Michael potrebbe farti iniziare. –

15

Per trovare un contenuto in una colonna XML, esaminare il metodo exist(), come descritto in MSDN here.

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

... per sostituire, utilizzare il metodo di modifica(), come descritto here.

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

..Tutto assumendo SqlServer 2005 o 2008. Questo si basa su XPath, che avrete bisogno di sapere.

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

"tipo di dati XML è argomento valido per l'argomento 1 di sostituire fuction" –

Problemi correlati