2011-03-17 106 views
6

我有一個名爲XML的表(在SQL Server 2008中),它有一個XML類型的字段叫XmlDocument。我試圖從XML變量中刪除一個屬性。如何從sql server 2008中的XML變量中刪除屬性?

這裏是我的XML看起來像

<clue_personal_auto xmlns="http://cp.com/rules/client"> 
    <admin> 
    <receipt_date>03/16/2011</receipt_date> 
    <date_request_ordered>03/16/2011</date_request_ordered> 
    <report_usage>Personal</report_usage> 
    </admin> 
</clue_personal_auto> 

我查詢

UPDATE XML 
SET XmlDocument.modify('delete (/clue_personal_auto/@xmlns)[1]') 
WHERE xmlid = 357 

當我查詢分析器中運行此查詢我看到消息「1行(S)的影響」,但在現實中clue_personal_auto元素的xmlns屬性未被刪除。任何想法我做錯了什麼。

感謝 BB

+2

(1行受影響)僅表示您執行了更新。如果有時間戳列,它將會改變。正如'update tbl set id = id'也成功,但什麼都不做 – RichardTheKiwi 2011-03-17 22:16:03

+0

請注意SQL.Server函數'.modify()'使用供應商的[XML數據修改語言](http://msdn.microsoft.com/ en-us/library/ms177454.aspx) – 2011-03-17 22:54:39

回答

2

我似乎無法找到一個簡單的方法來做到這一點的例子 - 但真正的問題是:爲什麼你要刪除的命名空間?使用WITH XMLNAMESPACES ...構造,您可以輕鬆地使用名稱空間。

而不是花大力氣擺脫它 - 瞭解XML名稱空間並開始使用它們!

你可以很容易地使用XML命名空間在查詢:

;WITH XMLNAMESPACES (DEFAULT 'http://cp.com/rules/client') 
SELECT 
    XmlDocument.value('(/clue_personal_auto/admin/report_usage)[1]', 'varchar(25)') 
FROM XML 
WHERE ID = 357 

,並很樂意與它 - 沒有必要人爲刪除xmlns=聲明瞭!

+0

謝謝Marc_s,幫助和工作.. :-) – BumbleBee 2011-03-17 22:33:08

+1

擺脫名稱空間的一個原因是,他們打破了以前從未與他們一起工作的許多遺留代碼。在我的應用程序中,名稱空間不起作用(除了使現有的XPath命令停止工作外)。 – 2013-11-29 16:58:03

4

您需要使用WITH xmlnamespaces,否則 「/ clue_personal_auto」 不匹配的命名空間clue_personal_auto xmlns="..."節點。

不僅如此,因爲它不是一個普通的屬性,所以不能實際刪除名稱空間。

除去常規屬性

declare @xml table (xmlid int, xmldocument xml) 
insert @xml select 357, ' 
<clue_personal_auto xmlns="http://cp.com/rules/client" otherattrib="x"> 
    <admin> 
    <receipt_date>03/16/2011</receipt_date> 
    <date_request_ordered>03/16/2011</date_request_ordered> 
    <report_usage>Personal</report_usage> 
    </admin> 
</clue_personal_auto>' 

;WITH XMLNAMESPACES ('http://cp.com/rules/client' as ns) 
UPDATE @XML 
SET XmlDocument.modify('delete (/ns:clue_personal_auto/@otherattrib)[1]') 
WHERE xmlid = 357 

select * from @xml 
+0

謝謝理查德,那太棒了。 – BumbleBee 2011-03-17 22:34:17

4
UPDATE XML 
    SET CONVERT(XML, REPLACE(CONVERT(NVARCHAR(MAX), XmlDocument), N' xmlns=...')) 
WHERE ID = 357 
+0

不錯 - 蠻力但有效! – 2013-11-29 16:58:40