SQL Xquery Как заменить текст в обновлении запроса - PullRequest
10 голосов
/ 23 февраля 2011

Таблица названа как MasterTable

Столбцы

ID тип BIGINT,

Name тип VARCHAR(200) (магазины xml типданные по некоторым причинам)

Name содержит данные, структурированные как

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

Когда мне нужно Update Таблица Master, тогда в то время яНеобходимо привести Varchar к xml, затем условно обновить / заменить value часть определенного тега, т.е. либо en-US / it-IT.

Также есть вероятность, что Нет данных / тегов в столбце Name, поэтому я думаю, что во время вставки данных в таблицу будет Insert пустых элементов тегов, таких как <en-US></en-US><it-IT></it-IT>, поэтому запрос update должен handle пустое значение в элементах тега, а именно en-US/it-IT.

Я пытаюсь сделать это как следующий запрос на обновление.

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

Я получаю следующую ошибку, когдавыполнение запроса

Незаконное использование метода типа данных xml 'modify'.В этом контексте ожидается не мутаторный метод.

1 Ответ

18 голосов
/ 23 февраля 2011

Нельзя назначать из xml.modify.Модификация работает с переменной / столбцом напрямую.Вы также не можете использовать модификацию приведения.

Вы можете извлечь имя в переменную xml, изменить xml и затем вернуть его в таблицу.

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

Если вам нужноэто позволяет работать более чем с одной строкой одновременно. Вы можете использовать табличную переменную со столбцами id и name, где тип данных для имени равен xml вместо переменной @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
...