LIKE在SQL Server XML数据类型中的比较

时间:2013-04-10 19:07:13

标签: sql sql-server xml xquery

我有一个带有XML数据类型列的数据库表。该列包含如下值:

<NameValuePairCollection>
  <NameValuePair Name="Foo" Value="One" />
  <NameValuePair Name="Bar" Value="Two" />
  <NameValuePair Name="Baz" Value="Three" />
</NameValuePairCollection>

我正在尝试查询XML数据类型列的"One"值为"Foo"的所有行。我无法创建适当的XQuery来过滤结果。

我发现了一些相关的SO问题,这些问题帮助了我,但我仍然无法让它发挥作用。

How can I query a value in SQL Server XML column
Use a LIKE statment on SQL Server XML Datatype

这是我到目前为止的SQL:

select * 
from MyTable 
where [XmlDataColumn].value('((/NameValuePairCollection/NameValuePair)[@Name="Foo"])[@Value]', 'varchar(max)') = 'One'
order by ID desc 

以下是我现在收到的错误:

XQuery [MyTable.XmlDataColumn.value()]: Cannot atomize/apply data() on expression that contains type 'NameValuePair' within inferred type 'element(NameValuePair,#anonymous) *'

更新(响应@LeoWörteler的建议)

根据您的回答,我将SQL更改为:

select * 
from MyTable with(nolock) 
where [XmlDataColumn].value('/NameValuePairCollection/NameValuePair[@Name="Subject"]/@Value', 'varchar(max)') = 'One'
order by ID desc 

但这仍然不起作用。我收到以下错误:

XQuery [MyTable.XmlDataColumn.value()]: 'value()' requires a singleton (or empty sequence), found operand of type 'xs:string *'

2 个答案:

答案 0 :(得分:3)

如果要使用Value中的XPath表达式选择NameValuePair属性的值而不是整个[XmlDataColumn].value(...)元素的值,则应该有效:

/NameValuePairCollection/NameValuePair[@Name="Foo"]/@Value

您的表达式仅检查NameValuePair是否具有属性Value

如果有多个元素具有正确的名称,并且您想要检查其中是否有任何元素具有值"One",则可以使用exist(...)方法:

where [XmlDataColumn].exist(
  '/NameValuePairCollection/NameValuePair[@Name="Subject" and @Value="One"]') = 1

答案 1 :(得分:1)

另一种选择是将XML转换为varchar,然后搜索给定的字符串,就像XML输入varchar字段一样。

SELECT * 
FROM Table
WHERE CAST(Column as nvarchar(max)) LIKE '%Name="Foo" Value="One"%'

我喜欢这个解决方案,因为它很干净,易于记忆,很难搞乱,并且可以作为where子句的一部分使用。

它不像Leo提供的答案那样动态和完整,但根据具体情况,它可能是一种“快速”的方式来获取所需的数据。