使用SQL Server XML数据类型

Gor*_*onB 9 xml sql xpath sql-server-2005

我有一个有XML字段的表.它包含的典型XML是;

<things>
  <Fruit>
    <imageId>39</imageId>
    <title>Apple</title>
  </Fruit>
  <Fruit>
    <imageId>55</imageId>
    <title>Pear</title>
  </Fruit>
  <Fruit>
    <imageId>76</imageId>
    <title>Grape</title>
  </Fruit>
</things>
Run Code Online (Sandbox Code Playgroud)

在我的表中,我有大约50行,我只关心两个字段,omId(int主键)和omText(我的xml数据).

我想要实现的是一种说法,在整个表格中的所有xml数据中...给我所有标题为X的xmlElements.或者给我一个使用imageId为55的所有项目的计数.

我正在使用XML数据类型VALUE和QUERY函数来检索数据.

   select omID,
   omText.query('/things/Fruit')
   ,cast('<results>' + cast(omText.query('/things/Fruit') as varchar(max)) + '</results>' as xml) as Value
   from dbo.myTable
   where omText.value('(/things/Fruit/imageId)[1]', 'int') = 76
Run Code Online (Sandbox Code Playgroud)

这只适用于我正在搜索的id是文档中的第一个.它似乎没有搜索所有的xml.

从根本上说,结果集为TABLE中的每个条目返回一行,我认为我需要为每个匹配的ELEMENT设置一行...不完全确定如何开始为此编写分组.

我开始觉得我正在努力使它变得更难......想法和想法请.

mar*_*c_s 16

我想要实现的是一种说法,在整个表格中的所有xml数据中...给我标题为X的所有xmlElements.

不确定我是否完全理解你的问题 - 或者你在寻找这个?您可以将所有/ things/Fruit元素作为"节点"抓取,并将它们与myTable中的"基础数据"交叉连接 - 结果将是XML数据字段中每个XML元素一行:

select 
   omID,
   T.Fruit.query('.')
from 
   dbo.myTable
cross apply
   omText.nodes('/things/Fruit') as T(Fruit)
where 
   T.Fruit.value('(title)[1]', 'varchar(50)') = 'X'
Run Code Online (Sandbox Code Playgroud)

或者给我一个使用imageId为55的所有项目的计数.

select 
   count(*)
from 
   dbo.myTable
cross apply
   omText.nodes('/things/Fruit') as T(Fruit)
where 
   T.Fruit.value('(imageId)[1]', 'int') = 55
Run Code Online (Sandbox Code Playgroud)

这就是你要找的东西吗?

  • 很高兴我能帮忙,戈登!我到目前为止发现的最好的SQL XML DML文章已经很老了,但仍然非常有用:http://www.15seconds.com/Issue/050803.htm (2认同)