web-dev-qa-db-ja.com

SQL ServerのXMLノード値を更新する

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)

更新

次に、「foo」の値を持つすべての行のGroupIDを更新する必要があります。

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

これは、この基準を満たす最初の行のみを更新しています。すべての行をどのように更新しますか?

Update 2このステートメントは機能します。最初のノードのデータベース構造は異なる場合があることがわかります。単純な//GroupID...etcがすべての行を更新しました。私たちをだましてしまうのは、常に愚かな小さなことです。

24
Ryan

あなたはこのようなことをすることができます:

UPDATE 
   dbo.profiles
SET 
   ProfileXML.modify('replace value of (/ProblemProfile/GroupID/text())[1] with "0"')
WHERE
   id = 23

.modifyキーワードを使用して実行できる操作(挿入、削除、置換など)の詳細については、この記事 SQL Server 2005 XQueryおよびXML-DML を参照してください。

マーク

PS:値を取得するために、これを実行する方がはるかに簡単です。

SELECT ProfileXML.value('(/ProblemProfile/GroupID)[1]', 'int') as ID
FROM dbo.profiles
WHERE id = 23

(もちろん、後で何か他のもののためにSQL変数としてXMLが必要でない限り)

37
marc_s

要素内のテキストを変更する最も簡単な方法

UPDATE [TableName]
   SET  
      [fieldName].modify('replace value of (root/elementName/text())[1] with "wBob"')
GO
0
Tarek El-Mallah