Bum*_*Bee 6 xml sql xml-dml sql-server-2008
我有一个名为XML的表(在SQL Server 2008中),它有一个名为XmlDocumenttype 的字段XML.我试图从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>
Run Code Online (Sandbox Code Playgroud)
我的查询
UPDATE XML
SET XmlDocument.modify('delete (/clue_personal_auto/@xmlns)[1]')
WHERE xmlid = 357
Run Code Online (Sandbox Code Playgroud)
当我在查询分析器中运行此查询时,我看到消息"1行受影响",但实际上clue_personal_auto元素的xmlns属性未被删除.知道我做错了什么.
谢谢BB
UPDATE XML
SET CONVERT(XML, REPLACE(CONVERT(NVARCHAR(MAX), XmlDocument), N' xmlns=...'))
WHERE ID = 357
Run Code Online (Sandbox Code Playgroud)
您需要使用WITH xmlnamespaces,否则“/clue_personal_auto”与 NAMESPACEDclue_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
Run Code Online (Sandbox Code Playgroud)
我似乎找不到一种简单的方法来做到这一点 - 但真正的问题仍然是:为什么要删除名称空间?使用该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
Run Code Online (Sandbox Code Playgroud)
并对此感到满意 - 不再需要人为删除xmlns=声明!