使用XMLNAMESPACES搜索特定值时遇到问题
问题描述:
我查看了一下,但无法找到能帮助我解决问题的答案。 (最有可能是由于我的技能很差)使用XMLNAMESPACES搜索特定值时遇到问题
但是希望有人能够指引我朝着正确的方向前进。
问题: 我在查询表中有一个XML列,我需要查询返回具有特定值的所有行的行。
从XML列的一个例子
<EventD xmlns="http://example1" xmlns:e3q1="http://example2" xmlns:xsi="http://example3" xsi:type="e3q1:Valuechange">
<e3q1:NewValue>Running</e3q1:NewValue>
<e3q1:OldValue>Stopped</e3q1:OldValue>
</EventD>
什么,我需要做的就是去返回“的NewValue”的所有行的“暗战”
;WITH XMLNAMESPACES ('example2' as e3q1)
select top 100
Xml.value('(EventD/NewValue)[1]', 'varchar(100)'),
* from Table1
and Xml.value('(EventD/NewValue)[1]', 'varchar(100)') like 'Running'
然而,这似乎并没有不返回任何行,如果有人能指出我在这里做错了什么,我会很感激。
由于提前,
答
你确实声明了命名空间e3q1
(尽管它缺少了http://
而你不使用它亚特...),但是你没有申报的默认命名空间
DECLARE @tbl TABLE([Xml] XML);
INSERT INTO @tbl VALUES
(
N'<EventD xmlns="http://example1" xmlns:e3q1="http://example2" xmlns:xsi="http://example3" xsi:type="e3q1:Valuechange">
<e3q1:NewValue>Running</e3q1:NewValue>
<e3q1:OldValue>Stopped</e3q1:OldValue>
</EventD>'
);
;WITH XMLNAMESPACES (DEFAULT 'http://example1', 'http://example2' as e3q1)
SELECT [Xml].value('(EventD/e3q1:NewValue)[1]', 'varchar(100)')
from @tbl AS Table1
WHERE Xml.value('(EventD/e3q1:NewValue)[1]', 'varchar(100)') like 'Running';
但这种方法是 - 至少我是这么认为的 - 你真的想不是。我认为你正在寻找.nodes()
。接下来的几行显示了替代名称空间替换为通配符的方法。但我会建议尽可能具体。
SELECT Only.Running.value('text()[1]', 'varchar(100)')
from @tbl AS Table1
CROSS APPLY Xml.nodes('*:EventD/*:NewValue[text()="Running"]') AS Only(Running)
答
貌似的Jeroen Mostert已经说明了一切必要的 我只能添加 - 命名空间的名称并不重要,只有URI
declare @xml xml='<EventD xmlns="http://example1" xmlns:e3q1="http://example2" xmlns:xsi="http://example3" xsi:type="e3q1:Valuechange">
<e3q1:NewValue>Running</e3q1:NewValue>
<e3q1:OldValue>Stopped</e3q1:OldValue>
<xsi:test>test</xsi:test>
<test1>test1</test1>
</EventD>'
;WITH XMLNAMESPACES ('http://example2' as test)
select
@xml.query('(*/test:*)')
与
select
@xml.query('(*/*)')
结果比较
+0
重点是ommited * default *命名空间。你使用'*',通过这个问题,但你不应该使用这种方法... – Shnugo
这是SQL Server不是MySQL。两个非常不同的产品 – gbn
1)名称空间名称是'http:// example2',而不是'example2'; 2)你不在你的查询中指定*任何名字空间。使用'e3q1:NewValue',并为'http:// example1'声明另一个名称空间,以便您可以限定'EventD'。 –