使用 XMLNAMESPACES 搜索特定值时遇到问题

Trouble searching for specific values using XMLNAMESPACES

我查看了一下,但未能找到可以帮助我解决问题的答案。 (估计是我手艺不好)

但是我希望有人能够为我指明正确的方向。

问题: 我正在查询的 table 中有一个 XML 列,我需要查询 return 行所有具有特定值的行。

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>

我需要做的是 return 所有具有 "NewValue" 的行作为 "Running"

;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'

然而,这似乎根本 return 没有任何行,如果有人能指出我在这里做错了什么,我将不胜感激。

提前致谢,

看起来 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('(*/*)') 

您确实声明了命名空间 e3q1(虽然它缺少 http:// 并且您以后不会使用它......),但您没有声明 default命名空间

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)