Запрос столбца типа XML в SQL Server 2008 - PullRequest
2 голосов
/ 09 сентября 2010

Я создал таблицу со столбцом XML строгого типа в базе данных SQL2008. У меня проблемы с пониманием документации или примеров, которые показывают, как я могу сделать простой запрос, чтобы выбрать строки, которые имеют значение true для определенного элемента.

Самое близкое, что я могу получить без ошибок, это:

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

Но этот запрос возвращает все строки, а не только те, которые false для интересующего меня элемента.

Простой пример:

Определенная коллекция 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 хранится в строке

<?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>

Если бы кто-то мог показать мне, как создать XQuery, который бы возвращал только те строки с false для CompetitionExclusion , что было бы здорово. Все образцы, которые я обнаружил, имеют тенденцию иметь дело с атрибутами, а не с элементами.

Спасибо

1 Ответ

2 голосов
/ 09 сентября 2010

Я бы попробовал что-то вроде этого:

;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'

Запрос XML с использованием XQuery и использованием логических флагов, на мой взгляд, всегда немного беспорядок - я обычно просто рассматриваю эти записи как строки и сравниваю строки.

...