2009-09-17 14 views
21

GroupIDフィールドを0に更新する必要があります。値の取得方法を把握していますが、更新中の問題が発生しています。SQL ServerのXMLノード値を更新する

助けがあれば助かります!

<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」で

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 

これだけ満たしている最初の行を更新しているの価値を持つすべての単一の行のグループIDですこの基準。すべての行をどのように更新すればよいですか?

文の作品アップデート2 。最初のノードのデータベース構造が異なる可能性があります。単純な//GroupID...etcはすべての行を更新しました。それは常に私たちを笑ってくれる愚かな小さなものです。

答えて

32

あなたはこのような何か行うことができます。

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

あなたは.modifyキーワードで何ができるかについての詳細は、SQL Server 2005 XQuery and XML-DMLでこの記事をチェックアウト(挿入、削除などを交換します)。

マルク・

PS:もちろん、あなたが何かのためのSQL変数としてXMLを必要としない限り、

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

(:値を取得するためには、それだけでこれを行うには非常に簡単になりますelse later)

+0

実際はnodes()とvalues()の使用が良い方法です。この場合、何の違いもありませんが、複数の列が必要な場合は、nodes()を使用する方が良いでしょう。「nodes()メソッドとvalue()メソッドを組み合わせると、 "http://technet.microsoft.com/en-us/library/ms187508(SQL.90).aspx –

+0

@リムス:はい、良い点 - いくつかの値が必要な場合は、nodes()を使用すると全体的に意味があります。 –

+1

優秀私が必要とするもの。 –

関連する問題