1
select *
from tablename
where CONVERT(xml, Sections).value('(/sections/section/@value)[1]', 'varchar(1)') = 'f'

将在 Sections 列中正确检索具有以下值的记录:

<sections><section value="f" priority="4" /><section value="a" priority="4" /></sections>

但是错过了这个:

<sections><section value="w" priority="4" /><section value="f" priority="4" /></sections>

显然这是问题“ /sections/section/@value)[1]”,但我不理解语法,谷歌也没有太大帮助。我找到了一些让我走到这一步的代码,但我不知道如何修改它,以便它会查看所有标签,而不仅仅是第一个标签。我尝试删除[1]但出现以下错误:

XQuery [value()]: 'value()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'
4

2 回答 2

2

您可以使用存在()

select *
from tablename
where CONVERT(xml, Sections).exist('/sections/section[@value = "f"]') = 1

如果你想f在查询中使用一些动态值而不是硬编码,你可以使用sql:variable()

declare @Value varchar(10) = 'f'

select *
from tablename
where CONVERT(xml, Sections).exist('/sections/section[@value = sql:variable("@Value")]') = 1
于 2011-08-24T16:48:27.780 回答
1

如果您有多个 XML 标记条目,则需要使用.nodes()XQuery 方法:

select 
    *,
    Sections(Section).value('(@value)[1]', 'varchar(1)') 
from tablename
cross apply CONVERT(xml, Sections).nodes('/sections/section') AS Sections(Section)

有了这个,您创建了一个名为“伪表” Sections(Section),其中包含与 XPath 匹配的每个元素的一个 XML 行(对于每个<section>under <sections>)。.value()然后,您可以使用常用方法进入此伪表并从这些 XML“行”中提取单个信息位

于 2011-08-24T16:45:09.623 回答