我的表@T在SQL Server 2005上有一个XML列xmlcol。我想查询某些节点包含特定值的所有行。
declare @T table(xmlcol Xml)
insert into @T values('
<root>
<items>
<item>
<x1>
<id>12345678</id>
</x1>
<x2>
<count>12</count>
</x2>
</item>
<item>
<x1>
<id>99999999</id>
</x1>
<x2>
<count>10</count>
</x2>
</item>
</items>
</root>')
select
[xmlcol].query('/root/items/item')
from @T
where
[xmlcol].exist('/root/items/item/x1/id[contains(.,"12345678")]') = 1
此查询显示所有内容,但我只需显示ONE,如下所示:
<item>
<x1>
<id>12345678</id>
</x1>
<x2>
<count>12</count>
</x2>
</item>
我发现了类似的问题,但只有值,我无法重写show节点的查询。 是否可以选择我需要的xml部分?
谢谢
答案 0 :(得分:1)
您正在使用的查询的语义类似于
SELECT
"all nodes from XML document matching XPath expression"
WHERE
"there is one node in XML document matching XPath expression"
您可以完全跳过WHERE
子句,但将其内容移动到XPath谓词中。 XPath谓词将过滤器设置为轴步骤,将它们想象为某种节点测试。您可能希望保留WHERE
子句以避免出现空结果(如果某些列根本没有匹配项。)
select
[xmlcol].query('/root/items/item[x1/id[contains(.,"12345678")]]')
from @T
尝试SQL Fiddle上的查询。