T-SQL查询部分xml

时间:2013-12-02 21:50:17

标签: sql xml tsql sql-server-2005 xquery

我的表@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部分?

谢谢

1 个答案:

答案 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上的查询。