2016-08-29 26 views
1

大きなXMLテキスト値MSSQL内のXMLタグ値を置き換えます。MSSQL内のXML値を更新する

MSSQL内には、非常に大きなXMLを持つテキスト列であるformという列があります。特定のタグを見つけ、タグ内のそのサブタグの値をFalseからTrueに変更する必要があります。

これは私が現在持っているものです。

USE trainset; 
UPDATE dbo.users 
SET formxml = REPLACE(CAST(formxml as nvarchar(max)), '%<ttaycheckbox><name>cbTermsConditions</name><cargo>F</cargo></ttaycheckbox>%', '<ttaycheckbox><name>cbTermsConditions</name><cargo>T</cargo></ttaycheckbox>') 

WHERE usersid = '0000GARX' 
and formname ='ffOrderRpt' 
and formxml LIKE ('%<ttaycheckbox><name>cbTermsConditions</name><cargo>F</cargo></ttaycheckbox>%') 

それが更新を行っているように思え、 しかし、この後に私がこの特定の値を選択すると、の値はTrueではなくFalseです。

正しく更新されない原因は何ですか?

+1

を - ほとんどすべてのケースで - 悪いアプローチ、文字列型に既存のXMLをキャストが、それを修正し、それをバックキャストします。これは、副作用(例えば、CDATAセクションを取り除く)を有する可能性がある。できるだけ* real * XMLメソッドを使用するべきです(この場合は '.modify()')。 – Shnugo

答えて

1

replace()は、ワイルドカードをサポートしていません。したがって、あなたのwhere ... likeは関連するレコードを見つけますが、は何も見つからないので、リテラル%を探しています。

+0

ああ、それはそれを説明する大丈夫....だから私はこれを行うことについて行くだろうか?私はそこのサブストリングを置き換える必要があるからです。 – a415

+0

'replace( ''、 ' 0

+0

ありがとうMarc。私はそれを逃したとは信じられません。 – a415

0

あなたはXML modifyexist使用することができます:ある

UPDATE users 
SET formxml.modify('replace value of (/ttaycheckbox/cargo/text())[1] with "T"') 
WHERE usersid = '0000GARX' 
and formname ='ffOrderRpt' 
and formxml.exist('/ttaycheckbox/name[text()[1] eq "cbTermsConditions"]') = 1 
and formxml.exist('/ttaycheckbox/cargo[text()[1] eq "F"]') = 1 
関連する問題