2010-09-09 75 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總是有點亂,在我看來 - 我通常只把這些條目字符串並進行字符串比較。