2017-04-05 9 views
0

Aの属性を持つXml要素を、列内のXml値からxxxxの値で削除する必要があります。テーブル内のxml列を更新する

方法1:

update t set x = x.query('//E[@A != "xxxx"]') 

方法2:

1が優れている
update t set x.modify('delete /E[@A = "xxxx"]') 

+0

メンテナンス上の理由から私はそれを選択したいと思います。 – pmbAustin

答えて

1

両方のコールが同じことをしないだろう。このアプローチは

SET @[email protected](N'//test[@a!="xxx"]') 

のいずれかで、この--try

DECLARE @xml XML= 
N'<root> 
    <test pos="1" a="xxx">test 1</test> 
    <test pos="2" a="SomeOther">test 2</test> 
    <test pos="3" a="xxx">test 3</test> 
    <OtherElement>This is another element</OtherElement> 
    </root>'; 

を、-ORこの

SET @xml.modify(N'delete //test[@a="xxx"]') 

SELECT @xml; 

結果でそれを試してみてください最初のものは

<test pos="2" a="SomeOther">test 2</test> 

<root> 
    <test pos="2" a="SomeOther">test 2</test> 
    <OtherElement>This is another element</OtherElement> 
</root> 

XMLはテキストとして保存されていない第2のリターンはあなたがを見ながら。複雑な文書を表すツリー構造として格納されます。 に変更するこれはかなり簡単です、ちょうどいくつかの要素を蹴ってください。 query()のアプローチでは、XMLを再構築し、最初のものを新しいものに置き換えなければなりません。だから私の明確な助言は:modify()のアプローチを使用してください! XQueryFLWORで本当にうまくいけば、query()のアプローチははるかに強力ですが、これは別の話です...

+0

同意します。私の場合、ルートXML要素はなく、要素は1つしかありません(あなたの例では、 "test"の要素だけがあります)。だから私はパフォーマンスの違いに焦点を当てていた。 – ca9163d9

+0

@ dc7a9163d9について*私はパフォーマンスの差に焦点を当てていた*私は[あなたの馬のレース](https://ericlippert.com/2012/12/17/performance-rant/)を読むことをお勧めします: - D – Shnugo

関連する問題