小编典典

使用SQL Server XML数据类型

sql

我有一个具有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>

在我的表中,我大约有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

仅在我要搜索的ID是文档中的第一个ID的情况下才有效。它似乎并没有搜索所有的xml。

从根本上说,结果集返回表中的每个条目一行,我想我需要为每个匹配的元素有一行…不确定如何为此写一个分组依据。

我开始觉得我正在使这个工作变得比需要做的难。


阅读 216

收藏
2021-03-23

共1个答案

小编典典

我想要实现的是一种表达方式,跨整个表中的所有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'

或给我计数使用imageId为55的所有项目的数量。

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

那是您要找的东西吗?

2021-03-23