如何从sql server 2008中的XML变量中删除属性?

问题描述:

我有一个名为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

我似乎无法找到一个简单的方法来做到这一点的例子 - 但真正的问题是:为什么你要删除的命名空间?使用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

您需要使用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

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

不错 - 蛮力但有效! – 2013-11-29 16:58:40