使用 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)
我查看了一下,但未能找到可以帮助我解决问题的答案。 (估计是我手艺不好)
但是我希望有人能够为我指明正确的方向。
问题: 我正在查询的 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)