Обновить значение узла XML в SQL Server - PullRequest
24 голосов
/ 17 сентября 2009

Мне нужно обновить поле 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 Это утверждение работает. Оказывается, структура базы данных для первого узла может быть разной. Простой //GroupID...etc обновляется в каждой строке. Это всегда глупые мелочи, которые сбивают нас с толку, ха-ха.

Ответы [ 2 ]

36 голосов
/ 17 сентября 2009

Вы можете сделать что-то вроде этого:

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 для чего-то еще)

0 голосов
/ 28 сентября 2018

Самый простой способ изменить текст внутри элемента

UPDATE [TableName]
   SET  
      [fieldName].modify('replace value of (root/elementName/text())[1] with "wBob"')
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...