我有以下 SQL 查询:
DECLARE @XMLDOC XML
SET @XMLDOC = '<Feed><Product><Name>Foo</Name></Product></Feed>'
SELECT x.u.value('Name[1]', 'varchar(100)') as Name
from @XMLDOC.nodes('/Feed/Product') x(u)
这将返回:
Name
----
Foo
然而,如果我的<Feed>
节点有一个xmlns
属性,那么这不会返回任何结果:
DECLARE @XMLDOC XML
SET @XMLDOC = '<Feed xmlns="bar"><Product><Name>Foo</Name></Product></Feed>'
SELECT x.u.value('Name[1]', 'varchar(100)') as Name
from @XMLDOC.nodes('/Feed/Product') x(u)
Returns:
Name
----
只有当我有一个xmlns
属性,其他都可以。
为什么会这样?如何修改 SQL 查询以返回结果而不考虑属性?
如果您的 XML 文档具有 XML 命名空间,那么您需要在查询中考虑这些命名空间!
因此,如果您的 XML 看起来像您的示例,那么您需要:
-- define the default XML namespace to use
;WITH XMLNAMESPACES(DEFAULT 'bar')
SELECT
x.u.value('Name[1]', 'varchar(100)') as Name
from
@XMLDOC.nodes('/Feed/Product') x(u)
或者,如果您希望显式控制要使用的 XML 命名空间(例如,如果您有多个),请使用 XML 命名空间前缀:
-- define the XML namespace
;WITH XMLNAMESPACES('bar' as b)
SELECT
x.u.value('b:Name[1]', 'varchar(100)') as Name
from
@XMLDOC.nodes('/b:Feed/b:Product') x(u)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)