2011-02-23 33 views
8

tabla se denomina como MasterTableSQL Xquery Cómo reemplazar texto en Consulta de actualización

Columnas

ID tipo BIGINT,

Name tipo VARCHAR(200) (tiendas xml Tipo de datos por algunas razones)

Name contiene datos estructurados como

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

Cuando necesito Update la Tabla Master entonces en ese tiempo que necesito para emitir el Varchar-xml entonces condicionalmente actualización/reemplazar la parte value de etiqueta en particular es decir, ya sea en-US/it-IT.

También hay posibilidades de que Sin datos/etiquetas hay en Name columna así que creo que en el momento de la inserción de datos sería Insert elementos de etiqueta vacía en la mesa como <en-US></en-US><it-IT></it-IT>, por lo que la consulta updatedebe manejar valor vacío en elementos de etiqueta es decir en-US/it-IT.

Intento hacerlo como si fuera una consulta de actualización.

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 

que conseguir siguiente error cuando se ejecuta la consulta

El uso ilegal de método de tipo de datos xml 'modificar'. Se espera un método no mutador en este contexto.

Respuesta

14

No se puede asignar desde un xml.modify. Modificar trabajos en la variable/columna directamente. Tampoco puedes usar modificar en un molde.

Puede extraer el nombre a una variable xml, modificar el xml y luego ponerlo de nuevo en la tabla.

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 

Si necesita que esto funcione durante más de una fila a la vez se puede utilizar una variable de tabla con columnas id y name donde el tipo de datos para el nombre es xml en lugar de la variable @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

me habían cambiado esta 'declarar @str varchar (200) = '' Test'' a declarar @str varchar (200) conjunto @str =' Test'' y ha funcionado .. Muchas gracias –

+0

¿Puedes decirme cómo hacerlo si el código anterior era 'COALESCE (@Name, Name)' y ahora quiero cambiarlo como 'UPDATE MasterTable set Name = Name.modify ('replace value of (en-US/text)()) [1] con sql: variable ("@ Str") ') donde ID = 18' del mismo modo es decir, manipular valores NULL en @Str –

+0

También como la columna 'Name' es' VARCHAR (200) ' así que estoy enfrentando el problema de llamar directamente a 'modificar' en él –

Cuestiones relacionadas