2011-02-23 10 views
8

Table è chiamato come MasterTableSql query XQuery Come sostituire testo in Query di aggiornamento

Colonne

ID tipo BIGINT,

Name tipo VARCHAR(200) (negozi xml Tipo di dati per alcuni motivi)

Name contiene dati strutturati come

<en-US>SomeEnglishText</en-US><it-IT>SomeItalicText</it-IT>

Quando ho bisogno di Update Tavola Master poi in quel momento ho bisogno di lanciare il Varchar-xml poi condizionale aggiornamento/sostituzione la value parte del particolare tag cioè sia en-US/it-IT.

Inoltre ci sono possibilità che Nessun dati/tag ci sono in Name colonna quindi penso che al momento dell'inserimento dei dati sarebbe Insert elementi tag vuoti nella tabella come <en-US></en-US><it-IT></it-IT>, in modo che la query updatedeve gestire valore vuoto in elementi di tag ossia en-US/it-IT.

Sto provando a farlo come dopo la query di aggiornamento.

DECLARE @Str VARCHAR(200) 

SET @Str = 'Test Text' 

UPDATE [MasterTable] 
SET [Name] = cast([MasterTable].[Name] as xml).modify('replace value of (en-US/text())[1] with sql:variable("@Str")') 
WHERE [ID]=18 

ho ottenere seguente errore quando si esegue la query

uso illegale di metodo di tipo di dati xml 'modificare'. Un metodo non mutante è previsto in questo contesto.

risposta

14

Non è possibile assegnare da xml.modify. Modifica funziona direttamente sulla variabile/colonna. Non è inoltre possibile utilizzare la modifica su un cast.

È possibile estrarre il nome in una variabile xml, modificare l'xml e quindi riportarlo nella tabella.

declare @str varchar(200) = 'Test' 
declare @xml xml 

select @xml = cast(Name as xml) 
from MasterTable 
where ID = 18 

set @xml.modify('replace value of (en-US/text())[1] with sql:variable("@Str")') 

update MasterTable 
set Name = cast(@xml as varchar(200)) 
where ID = 18 

Se avete bisogno di questo per lavorare su più di una riga alla volta è possibile utilizzare una variabile di tabella con le colonne id e name dove tipo di dati per nome è xml al posto della variabile @xml.

declare @str varchar(200) = 'Test Text' 
declare @T table (ID int, Name xml) 

insert into @T 
select ID, cast(Name as xml) 
from MasterTable 
where Name is not null 

update @T 
set Name.modify('replace value of (en-US/text())[1] with sql:variable("@Str")') 

update MasterTable 
set Name = cast(T.Name as varchar(200)) 
from @T as T 
where MasterTable.ID = T.ID 
+0

avevo cambiato questo 'dichiarare @str varchar (200) = 'Test'' a' dichiarare @str varchar (200) set @str =' Test'' e ha funzionato .. Grazie a lot –

+0

Puoi dire come fare se il codice precedente era 'COALESCE (@Name, Nome)' e ora voglio cambiarlo come 'UPDATE MasterTable set Nome = Nome.modifica ('sostituisci valore di (en-US/testo()) [1] con sql: variabile ("@ Str") ') dove ID = 18' in modo simile ie handle NULL in @Str –

+0

Anche come la colonna 'Name' è' VARCHAR (200) ' quindi sto affrontando il problema di chiamare direttamente 'modify' su di esso –