2010-09-09 43 views
2

我已经创建了一个在SQL2008数据库中具有强类型XML列的表。我无法理解文档或示例,这些文档或示例显示了如何通过简单查询来选择特定元素的值为true的行。在SQL Server 2008中查询XML类型列

我可以得到,而不必引发的错误最接近的是:

SELECT Person.* 
FROM [Profile].[Person] 
WHERE Flags.exist(' 
    declare namespace ws="http://schema/profile/person/2010/09/flags"; 
    ws:root/ws:CompetitionExclusion = xs:boolean("false")') = 1 

但这个查询返回的所有行不只是那些对我感兴趣的元素

简单。例如:

定义的XML架构集合

<?xml version="1.0" encoding="utf-16"?> 
<xs:schema xmlns:ws="http://schema/profile/person/2010/09/flags" 
      attributeFormDefault="unqualified" 
      elementFormDefault="qualified" 
      targetNamespace="http://schema/profile/person/2010/09/flags" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="CompetitionExclusion" type="xs:boolean" /> 
     <xs:element name="EnrolmentExclusion" type="xs:boolean" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
连续存放的

<?xml version="1.0" encoding="utf-16"?> 
<ws:root xmlns:ws="http://schema/profile/person/2010/09/flags"> 
    <ws:CompetitionExclusion>true</ws:CompetitionExclusion> 
    <ws:EnrolmentExclusion>false</ws:EnrolmentExclusion> 
</ws:root> 

如果有人能告诉我如何构建将与只返回行的,将是巨大CompetitionExclusion元素的XQuery

示例XML。我发现的所有样本都倾向于处理属性而不是元素。

感谢

回答

2

我会尝试这样的事:

;WITH XMLNAMESPACES('http://schema/profile/person/2010/09/flags' as ws) 
SELECT Person.* 
FROM [Profile].[Person] 
WHERE Flags.value('(ws:root/ws:CompetitionExclusion)[1]', 'varchar(20)') = 'false' 

查询使用XQuery和使用布尔标志XML总是有点乱,在我看来 - 我通常只把这些条目字符串并进行字符串比较。