2017-04-05 62 views
0

我需要從列中的Xml值中刪除具有A屬性的Xml元素,其值爲xxxx更新表中的xml列

方法1:

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

方法2:

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

哪一個更好?

+0

第二個意圖更清晰,所以出於維護的原因,我會選擇那個。 – pmbAustin

回答

1

兩個調用會做不一樣的:

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>'; 

--Try這與任何這種方法

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

--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不存儲爲文本你看到。它作爲表示複雜文檔的樹結構存儲。到修改這很容易,只是踢出一些元素。 query()方法必須重建XML並用新的替換第一個。所以我明確的建議是:使用modify()的方法!如果你真的很擅長XQueryFLWORquery()的方法更強大,但這是另一回事......

+0

同意。在我的情況下,沒有根XML元素,並且只有一個元素(在您的示例中,將只有「test」元素)。所以我專注於性能差異。 – ca9163d9

+0

@ dc7a9163d9關於*我關注性能差異*我建議閱讀[比賽你的馬](https://ericlippert.com/2012/12/17/performance-rant/): - D – Shnugo