Обновить значение XML node в SQL Server
Мне нужно обновить поле GroupID до 0. Я выяснил, как получить значение, теперь у меня возникают проблемы с его обновлением.
Любая помощь была бы здоровой!
<ProblemProfile>
<GroupID>-1</GroupID>
<LayoutID>1</LayoutID>
<MyQueries>false</MyQueries>
</ProblemProfile>
Declare @Result xml
set @Result = convert(xml,(select ProfileXML from profiles where id = 23))
SELECT x.value('.', 'int') ID
FROM @Result.nodes('/ProblemProfile/GroupID') as R(x)
Обновление
Теперь мне нужно обновить каждую группу GroupID, которая имеет значение 'foo'
declare @foo int
set @foo = -1
UPDATE profiles
SET ProfileXML.modify('replace value of (/ProblemProfile/GroupID/text())[1] with "0"')
WHERE ProfileXML.value('(/ProblemProfile/GroupID)[1]', 'int') = @foo
Это обновление только первой строки, соответствующей этим критериям. Как обновить каждую строку?
Обновление 2
Это утверждение работает. Оказывается, структура базы данных для первого node может быть разной. Простой //GroupID...etc обновляет каждую строку. Это всегда глупые мелочи, которые заставляют нас хаха.
Ответы
Ответ 1
Вы можете сделать что-то вроде этого:
UPDATE
dbo.profiles
SET
ProfileXML.modify('replace value of (/ProblemProfile/GroupID/text())[1] with "0"')
WHERE
id = 23
Ознакомьтесь с этой статьей SQL Server 2005 XQuery и XML-DML для получения более подробной информации о том, что вы можете сделать с ключевым словом .modify
вставить, удалить, заменить и т.д.).
Марк
PS: Чтобы получить значение, было бы намного проще сделать именно это:
SELECT ProfileXML.value('(/ProblemProfile/GroupID)[1]', 'int') as ID
FROM dbo.profiles
WHERE id = 23
(если вам не нужен XML как переменная SQL для чего-то еще в дальнейшем)
Ответ 2
Самый простой способ изменить текст внутри элемента
UPDATE [TableName]
SET
[fieldName].modify('replace value of (root/elementName/text())[1] with "wBob"')
GO
Ответ 3
Может кто-нибудь помочь это хотеть изменить все узлы в коллекции XML, каждый раз, когда значение повторяется. запрос, который я хочу написать, находится в sql-сервере
В этом примере я хочу заменить на "xxx" все узлы в коллекции, где GroupID = -1 включает GroupID, LayoutID, MyQueries