Правила и ограничения по использованию коллекций XML-схем на сервере

Изменения: 14 апреля 2006 г.

Язык определения XML-схем (XSD) имеет некоторые ограничения при проверке правильности столбцов SQL, использующих тип данных SQL Server 2005 — xml. Этот раздел содержит подробные сведения об этих ограничениях, а также рекомендации по изменению XSD-схемы таким образом, чтобы она могла работать с SQL Server. Ограничения перечислены в следующей таблице. Следующие подразделы содержат более подробные сведения о каждом из них и указания по их использованию.

Элемент Ограничение

anyType

Спецификации XQuery рекомендуют выполнять слабую проверку для элементов типа anyType. Поскольку SQL Server не поддерживает слабую проверку, то для элементов anyType будет применена строгая проверка.

minOccurs и maxOccurs

SQL Server ограничивает размер значений для этих атрибутов.

sqltypes:datetime и sqltypes:smalldatetime

SQL Server не принимает значения sqltypes:datetime или sql:smalldatetime.

<xsd:include>, <xsd:key>, <xsd:keyref>, <xsd:redefine> и <xsd:unique>

Не поддерживается в SQL Server.

<xsd:choice>

SQL Server отклоняет схемы, содержащие примитив <xsd:choice> без дочерних элементов, если только он не определен с нулевым значением атрибута minOccurs.

значения <xsd:simpleType>

SQL Server для простых типов, имеющих секундные компоненты, поддерживает только точность до миллисекунд и задает пределы для всех распознанных перечислений простых типов XSD.

SQL Server не поддерживает использование значения «NaN» в объявлении <xsd:simpleType>.

xsi:schemaLocation и xsi:noNamespaceSchemaLocation

SQL Server пропускает эти атрибуты, если они присутствуют в данных экземпляра XML, вставленных в столбец или переменную с типом данных xml.

xs:QName

SQL Server не поддерживает типы, полученные из xs:QName, использующие элемент ограничения XML-схемы.

SQL Server не поддерживает в качестве члена элемента типы объединений с xs:QName.

Добавление элементов к существующей группе замещения

SQL Server не поддерживает добавление элементов к существующей группе подстановок в коллекции XML-схем.

Канонические формы

Каноническое представление значения не может нарушать ограничение шаблона для его типа.

Аспекты перечисления

SQL Server не поддерживает XML-схемы с типами, имеющими аспекты шаблона или перечисления, которые нарушают эти аспекты.

Длина аспекта

SQL Server ограничивает диапазон приемлемых значений для длины аспекта.

Атрибут идентификатора

Компоненты XML-схемы могут иметь атрибут идентификатора, но SQL Server не сохраняет эти значения.

Тип идентификатора

SQL Server не поддерживает элементы типов xs:ID и xs:IDREF.

Слабая проверка

SQL Server не поддерживает слабую проверку правильности для схем, передаваемых в SQL Server.

Список типов и объединенные типы

SQL Server не поддерживает списки типов, использующих типы объединений в качестве элементов списка.

Локальное пространство имен

SQL Server отклоняет схемы, использующие пустую строку ("") в качестве значения для атрибута пространства имен.

Смешанный тип и простое содержимое

SQL Server не поддерживает ограничение смешанного типа простым содержимым.

NOTATION, тип

SQL Server не поддерживает тип NOTATION.

Условия исчерпания памяти

В работе с большими коллекциями XML-схем может наступить условие исчерпания памяти. Решения обеспечиваются.

Повторяющиеся значения

SQL Server отклоняет схемы, в которых блокирующий или конечный атрибут имеет повторяющиеся значения.

Идентификаторы компонента схемы

SQL Server ограничивает идентификаторы компонентов схемы до максимальной длины в 1000 символов Юникода. Кроме того, пары суррогатных символов в рамках идентификаторов не поддерживаются.

Сведения часового пояса

Сведения о часовом поясе всегда приводятся в формат UTC (время по Гринвичу).

Типы объединения

SQL Server не поддерживает ограничения от типов объединений.

Десятичные числа переменной точности

SQL Server не поддерживает десятичные числа переменной точности.

xsi:schemaLocation и xsi:noNamespaceSchemaLocation

SQL Server пропускает следующие атрибуты, если они существуют в данных экземпляра XML, вставленных в столбец или переменную типа данных xml.

  • xsi:schemaLocation
  • xsi:noNamespaceSchemaLocation

&lt;xsd:include&gt;

Элемент W3C XSD include обеспечивает поддержку модульности схемы, при которой XML-схема может быть разделена на несколько физических файлов. В настоящее время SQL Server не поддерживает этот элемент. XML-схемы, содержащие данный элемент, отклоняются сервером.

Чтобы решить эту проблему, можно предварительно обработать XML-схемы, включающие директиву <xsd:include>, произведя копирование и слияние содержимого любых включенных схем в единую схему для ее последующей загрузки на сервер. Дополнительные сведения см. в разделе Препроцессор для XML-схем.

&lt;xsd:unique&gt;, &lt;xsd:key&gt; и &lt;xsd:keyref&gt;

В настоящее время SQL Server не поддерживает следующие, относящиеся к XSD ограничения для обеспечения уникальности или установки ключей и ссылок на ключи.

  • <xsd:unique>
  • <xsd:key>
  • <xsd:keyref>

Схемы XML, содержащие эти элементы, не могут быть зарегистрированы.

Канонические формы и ограничения шаблона

Аспект шаблона XSD позволяет вводить ограничение лексического пространства простых типов. Когда ограничение шаблона наложено на тип, для которого есть больше одного возможного лексического представления, некоторые значения могут вызвать непредвиденное поведение в ходе проверки. Такое поведение возникает, потому что лексические представления этих значений не сохраняются в базе данных. Поэтому значения будут преобразованы к их каноническим представлениям при сериализации вывода. Если документ содержит значение, каноническая форма которого не соответствует ограничению шаблона для его типа, то документ будет отклонен, если пользователь попытается вставить его повторно.

Чтобы это предотвратить, SQL Server 2005 отклоняет любой документ XML, содержащий значения, которые не могут быть повторно вставлены из-за нарушения ограничений шаблона их каноническими формами. Например, значение «33.000» не пройдет проверку относительно типа, производного от xs:decimal с ограничением шаблона «33\.0+». Хотя «33.000» соответствует этому шаблону, его каноническая форма «33» шаблону не соответствует.

Поэтому следует быть внимательными при применении аспектов шаблона к типам, полученным из следующих примитивных типов: boolean,decimal, float, double, dateTime, time, date, hexBinary и base64Binary. SQL Server выдаст предупреждение при добавлении любых таких компонентов к коллекции схемы.

Неточная сериализация значений с плавающей запятой вызывает подобную проблему. Из-за алгоритма сериализации плавающей запятой, используемого SQL Server 2005, для подобных значений можно совместно использовать одну каноническую форму. Когда значение с плавающей запятой сериализовано и затем повторно вставлено, его значение может немного измениться. В редких случаях это может привести к значению, нарушающему любой из следующих аспектов для его типа при повторной вставке: enumeration, minInclusive, minExclusive, maxInclusive или maxExclusive. Чтобы это предотвратить, SQL Server 2005 отклоняет любые значения типов, полученных из xs:float или xs:double, которые не могут быть сериализованы и повторно вставлены.

Символы-шаблоны и проверка правильности содержимого

Символы-шаблоны используются для увеличения гибкости в том, в чем это разрешено для модели содержимого. Эти символы поддерживаются в языке XSD следующими способами.

  • Символы-шаблоны элемента. Они представлены элементом <xsd:any>.
  • Символы-шаблоны атрибута. Они представлены элементом <xsd:anyAttribute>.

Оба элемента символа-шаблона — <xsd:any> и <xsd:anyAttribute> — поддерживают использование атрибута processContents. Это позволяет задать значение, указывающее, как приложения XML обрабатывают проверку правильности содержимого документа, связанную с этими элементами символа-шаблона. Они являются различными значениями, и их действие заключается в следующем.

  • Значение strict указывает, что содержимое полностью подтверждено.
  • Значение skip указывает, что содержимое не подтверждено.
  • Значение lax указывает, что только элементы и атрибуты, для которых определения схемы являются доступными, будут подтверждены.

Слабая проверка

Для передаваемых в SQL Server схем слабая проверка не поддерживается. Поэтому, если атрибут processContents указан элементами символа-шаблона, он должен быть установлен или в skip, или в strict. Если указано processContents="lax", сервер отклонит схему.

Из-за этого поведения любые элементы, введенные как xsd:anyType, будут подтверждаться со строгой обработкой. В результате их дочерние элементы и атрибуты должны быть определены в коллекции схемы, по отношению к которой должен быть подтвержден экземпляр документа.

Элементы anyType

Спецификации XQuery рекомендуют проверку правильности lax для элементов типа anyType. Поскольку SQL Server не поддерживает слабую проверку, для элементов anyType будет применена строгая проверка правильности.

Следующий пример иллюстрирует строгую проверку правильности и создает коллекцию XML-схем. Один из элементов схемы имеет тип anyType. Затем он создает типизированные переменные xml и иллюстрирует строгую проверку правильности элемента типа anyType.

CREATE XML SCHEMA COLLECTION SC AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="http://ns">
   <element name="e" type="anyType"/>
   <element name="a" type="byte"/>
   <element name="b" type="string"/>
 </schema>'
GO

Следующий пример выполнится без ошибок, так как успешно проходит строгая проверка <e>:

DECLARE @var XML(SC)
SET @var = '<e xmlns="http://ns"><a>1</a><b>data</b></e>'
GO

Следующий пример завершается неудачно. Экземпляр отклонен, так как при строгой проверке элемента <e> не найден элемент <c>, определенный в схеме:

DECLARE @var XML(SC)
SET @var = '<e xmlns="http://ns"><a>1</a><c>Wrong</c><b>data</b></e>'
GO

Экземпляр XML в следующем примере снова отклонен, потому что нет объявления для элемента <c> в пространстве имен http://whatever. Другими словами, пространство имен не существует.

DECLARE @var XML(SC)
SET @var = '<e xmlns="http://ns"><a>1</a><c xmlns="http://whatever">Wrong</c><b>data</b></e>'
SELECT @var
GO

&lt;xsd:redefine&gt;

Элемент W3C XSD redefine обеспечивает поддержку переопределения компонентов схемы. Однако поддержка этой директивы потенциально затратна в смысле производительности, а также требует, чтобы SQL Server повторно проверял все экземпляры типа данных xml, связанные с переопределенной схемой. Поэтому SQL Server не поддерживает этот элемент. XML-схемы, которые включают элемент <xsd:redefine>, будут отклонены сервером.

Чтобы обновить схему или ее компоненты, вместо этого можно сделать следующее.

  1. Сотрите любой столбец с типом данных xml (XML DT), используя коллекцию схем.
  2. Удалите существующую коллекцию схем XML для затронутого пространства имен.
  3. Создайте новую коллекцию схем XML для этого пространства имен с измененными компонентами схемы.
  4. Используя новую коллекцию, заново введите все столбцы, которые были стерты во время шага 1 как XML DT.

xs:QName

SQL Server не поддерживает типы, унаследованные из xs:QName и использующие элемент ограничения XML-схемы.

В настоящее время SQL Server не поддерживает типы объединений с QName в качестве типа элемента. Следующая инструкция CREATE XML SCHEMA COLLECTION не сможет загрузить XML-схему, так как указан тип xs:QName в качестве типа объединения:

CREATE XML SCHEMA COLLECTION QNameLimitation1 AS N'
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:simpleType name="myUnion">
        <xs:union memberTypes="xs:int xs:QName"/>
    </xs:simpleType>
</xs:schema>'
GO

CREATE XML SCHEMA COLLECTION QNameLimitation2 AS N'
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:simpleType name="myUnion">
        <xs:union memberTypes="xs:integer">
   <xs:simpleType>
    <xs:list itemType="xs:QName"/>
   </xs:simpleType>
  </xs:union>
    </xs:simpleType>
</xs:schema>'
GO

Обе инструкции потерпят неудачу с сообщением об ошибке.

Типы объединения в качестве элементов списка

В настоящее время SQL Server не поддерживает схемы, содержащие типы списка с элементами типа объединения. Следующий пример схемы иллюстрирует попытку поддержки использования типа объединения в типе элемента списка:

CREATE XML SCHEMA COLLECTION MySampleCollection AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ns" xmlns:ns="http://ns">
   <simpleType name="unionType">
      <union memberTypes="string byte"/>
   </simpleType>
   <simpleType name="listType">
      <list itemType="ns:unionType"/>
   </simpleType>
</schema>'
GO

Схема будет отклонена сервером со следующей ошибкой:

«Недопустимый тип элемента для типа списка 'http://ns:listType'. Тип элемента списка не может быть списком, а типы элементов объединения не поддерживаются в данной версии.»

Значения для &lt;xsd:simpleType&gt;

SQL Server поддерживает точность только до миллисекунд для простых типов, имеющих секундные компоненты. Кроме того, экземпляры XML со значениями dateTime, не содержащие часовых поясов, на сервере будут отклонены. Следующая таблица выделяет ограничения, которые применяются, основываясь на всех распознанных простых перечислениях типа XSD.

Помимо этого, SQL Server не поддерживает использование значения «NaN» в объявлении <xsd:simpleType>. Схемы, включающие значения «NaN», будут отклонены сервером.

Простой тип Ограничение

duration

Значение года должно быть в пределах диапазона от -2^31 до 2^31-1. Месяц, день, час, минута и секунда должны быть в пределах диапазона от 0 до 9999. Значение секунд имеет дополнительные три цифры точности справа от десятичного разделителя.

dateTime

Значение часа во вложенном поле часового пояса должно быть в пределах принятого диапазона от -14 до +14. Значение года должно быть в пределах диапазона от -9999 до 9999. Значение месяца должно быть в пределах диапазона от 1 до 12. Значение дня должно быть в пределах диапазона от 1 до 31 и должно быть правильной календарной датой. Например, SQL Server вернет ошибку при обнаружении неверной даты, например 1974-02-31 (поскольку в феврале не может быть 31).

date

Значение года должно быть в пределах диапазона от -9999 до 9999. Значение месяца должно быть в пределах диапазона от 1 до 12. Значение дня должно быть в пределах диапазона от 1 до 31 и должно быть правильной календарной датой. Например, SQL Server вернет ошибку при обнаружении неверной даты, например 1974-02-31 (поскольку в феврале не может быть 31).

gYearMonth

Значение года должно быть в диапазоне от -9999 до 9999.

gYear

Значение года должно быть в диапазоне от -9999 до 9999.

gMonthDay

Значение месяца должно быть в пределах от 1 до 12. Значение дня должно быть в пределах от 1 до 31.

gDay

Значение дня должно быть в диапазоне от 1 до 31.

gMonth

Значение месяца должно быть в диапазоне от 1 до 12.

decimal

Значения этого типа должны соответствовать формату числового типа SQL. Этот формат внутренне представляет поддержку чисел в общей сложности до 38 цифр, причем 10 из этих позиций цифр зарезервированы для дробной точности.

float

Значения этого типа должны соответствовать формату числового типа real языка SQL.

double

Значения этого типа должны соответствовать формату числового типа float языка SQL.

string

Значения этого типа должны соответствовать формату числового типа nvarchar(max) языка SQL.

anyURI

Значения этого типа не могут быть в длину больше, чем 4 000 символов Юникода.

Десятичные числа переменной точности

Тип xs:decimal представляет десятичные числа произвольной точности. Обработчики XML, соответствующие минимальным требованиям, должны поддерживать десятичные числа как минимум totalDigits=18 знаков. SQL Server поддерживает totalDigits=38, но ограничивает число десятичных знаков десятью. Десятичные числа переменной точности не поддерживаются. Все экземпляры значений xs:decimal внутренне представляются сервером в виде числового типа SQL (38, 10).

Сведения о часовом поясе

Для простых типов date, time и dateTime сведения о часовом поясе всегда приводятся ко времени по Гринвичу (UTC).

Например, следующая схема объявляет элемент <e> типа dateTime:

CREATE XML SCHEMA COLLECTION MySampleCollection AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ns" xmlns:ns="http://ns">
   <element name="e" type="dateTime"/>
</schema>'
GO

Для элементов типа dateTime сервер преобразует и вернет указанное время во время по Гринвичу, используя величину смещения (-05:00).

DECLARE @var XML(MySampleCollection)
SET @var = '<e xmlns="http://ns">1999-05-31T13:20:00-05:00</e>'
SELECT @var
-- time zone is specified. Value is converted to Zulu before being stored
-- will come back as <e xmlns="http://ns">1999-05-31T18:20:00Z</e>
GO

Длина аспекта

Аспекты length, minLength и maxLength хранятся как тип long. Этот тип является 32-разрядным типом. Поэтому диапазон приемлемых значений для их значений равен 2^31.

minOccurs и maxOccurs

Значения атрибутов minOccurs и maxOccurs должны укладываться в 4-байтовые целые числа. Схемы, которые не соответствуют этому условию, будут отклонены сервером.

Идентификаторы компонента схемы

SQL Server ограничивает максимальную длину идентификаторов компонентов схемы 1000 символами Юникода и отклоняет схемы с идентификаторами, превышающими эту длину. Кроме того, пары суррогатных символов в рамках идентификаторов не поддерживаются.

Аспекты перечисления

SQL Server отклоняет XML-схемы с типами, которые имеют шаблоны аспектов или перечислений, нарушающих эти аспекты. Например, следующая схема была бы отклонена, потому что показанное значение перечисления включает значение, использующее символы в разных регистрах. Она также была бы отклонена, потому что это значение нарушает значение шаблона, которое ограничивает значения только символами нижнего регистра.

CREATE XML SCHEMA COLLECTION MySampleCollection AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ns" xmlns:ns="http://ns">
    <simpleType name="MyST">
       <restriction base="string">
          <pattern value="[a-z]*"/>
       </restriction>
    </simpleType>

    <simpleType name="MyST2">
       <restriction base="ns:MyST">
           <enumeration value="mYstring"/>
       </restriction>
    </simpleType>
</schema>'
GO

&lt;xsd:choice&gt;

SQL Server отклоняет схемы, содержащие примитив <xsd:choice> без дочерних элементов, если только он не определен с нулевым значением атрибута minOccurs.

Повторяющиеся значения в конечном или блокирующем атрибуте

Атрибут block позволяет блокировать тип и замещение элемента из экземпляра. Атрибут final предотвращает образование из типа других сложных типов.

SQL Server отклоняет схемы, в которых атрибуты block или final содержат повторяющиеся значения, например «restriction restriction» и «extension extension».

Локальное пространство имен

Локальное пространство имен должен для элемента <xsd:any> быть явно указано. SQL Server отклоняет схемы, содержащие пустую строку ("") в качестве значения атрибута пространства имен. Вместо этого SQL Server требует явно указать значение «##local», которое означает, что элемент без квалификатора или атрибут будет использоваться как экземпляр символа-шаблона.

Атрибут идентификатора

Каждый компонент XML-схемы может иметь атрибут ID. SQL Server обеспечивает уникальность объявлений <xsd:attribute> типа ID, но не хранит эти значения. Областью видимости, в пределах которой значения должны быть уникальными, является инструкция {CREATE | ALTER} XML SCHEMA COLLECTION.

Тип идентификатора

SQL Server не поддерживает элементы типа xs:ID, xs:IDREF и xs:IDREFS. Схема не может объявлять элементы этого типа или элементы, полученные ограничением или расширением этого типа.

Тип NOTATION

В настоящее время SQL Server не поддерживает тип NOTATION. Схемы, включающие определения для примечаний, будут отклонены сервером.

Смешанный тип и простое содержимое

В следующей коллекции XML-схем myComplexTypeA является сложным типом, который может быть пустым. Это означает, что для обоих его элементов свойство minOccurs может быть установлено в значение 0. Попытка ограничить его простым содержимым, как это было сделано в объявлении myComplexTypeB, не поддерживается. Создание следующей коллекции XML-схем завершится ошибкой:

CREATE XML SCHEMA COLLECTION SC AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ns" xmlns:ns="http://ns"
xmlns:ns1="http://ns1">

    <complexType name="myComplexTypeA" mixed="true">
        <sequence>
            <element name="a" type="string" minOccurs="0"/>
            <element name="b" type="string" minOccurs="0" maxOccurs="23"/>
        </sequence>
    </complexType>


    <complexType name="myComplexTypeB">
        <simpleContent>
            <restriction base="ns:myComplexTypeA">
                <simpleType>
                    <restriction base="int">
                        <minExclusive value="25"/>
                    </restriction>
                </simpleType>
            </restriction>
        </simpleContent>
    </complexType>
</schema>
'
GO

sqltypes:datetime и sqltypes:smalldatetime

В SQL Server 2005 все типы, унаследованные из xs:date, xs:time и xs:dateTime, обязаны иметь часовые пояса. Это, в частности, типы Sqltypes:datetime и sqltypes:smalldatetime. А вот типы данных SQL datetime и smalldatetime часовых поясов не содержат. Это связано с тем, что аспекты шаблона для sqltypes:datetime и sqltypes:smalldatetime часовые пояса не учитывают. В результате этого SQL Server не принимает значения типов sqltypes:datetime или sql:smalldatetime.

Хотя можно ссылаться на sqltypes:datetime и sqltypes:smalldatetime в пользовательских схемах, XML-документы, содержащие значения этих типов, проверку не пройдут. Это делает их непригодными. В следующем примере коллекция XML-схем определяет элемент <c> типа sqltypes.datetime.

CREATE XML SCHEMA COLLECTION SC_datetime AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
targetNamespace="myNS"
xmlns:ns="myNS"
xmlns:s="https://schemas.microsoft.com/sqlserver/2004/sqltypes"
> 
      <import namespace="http://www.w3.org/XML/1998/namespace"/>
      <import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes"/>
 
      <element name="root">
            <complexType>
                  <sequence>
                        <element name="c" type="s:datetime"/>
                  </sequence>
            </complexType>
      </element>
</schema>'
GO

Следующее присваивание завершится ошибкой.

DECLARE @var xml(SC_datetime)
SET @var = '<x:root xmlns:x="myNS"><c>1953-01-01T00:00:00.000</c></x:root>'
GO

Добавление элементов к существующей группе замещения

Нельзя добавить элементы в существующую группу замещения в коллекции XML-схем. Группа замещения в схеме XML ограничена в том, что главный элемент и все члены этого элемента должны быть определены в одной инструкции {CREATE | ALTER} XML SCHEMA COLLECTION. Например, можно сделать следующее:

CREATE XML SCHEMA COLLECTION col AS N'
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="e1"/>
    <xs:element name="e2" substitutionGroup="e1"/>
</xs:schema>'

Однако нельзя сделать следующее, где главный элемент e1 определен в инструкции CREATE XML SCHEMA COLLECTION, а член замещения e2 определен в другой инструкции ALTER XML SCHEMA COLLECTION:

CREATE XML SCHEMA COLLECTION col AS N'
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="e1"/>
</xs:schema>'
GO

ALTER XML SCHEMA COLLECTION col add N'
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="e2" substitutionGroup="e1"/>

</xs:schema>'
GO

Типы-объединения

Ограничения на типы объединения не поддерживаются. Например, следующая инструкция CREATE XML SCHEMA COLLECTION приведет к ошибке.

CREATE XML SCHEMA COLLECTION particlesIk026valid AS N'<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://xsdtesting" xmlns:x="http://xsdtesting" elementFormDefault="qualified">
    <xsd:simpleType name="U1">
        <xsd:union>
            <xsd:simpleType>
                <xsd:restriction base="xsd:integer" />
            </xsd:simpleType>
            <xsd:simpleType>
                <xsd:restriction base="xsd:string" />
            </xsd:simpleType>
        </xsd:union>
    </xsd:simpleType>
    <xsd:simpleType name="U2">
        <xsd:restriction base="x:U1" />
    </xsd:simpleType>
    <xsd:complexType name="B">
        <xsd:choice>
            <xsd:element name="c1" type="x:U1" />
            <xsd:element name="c2" />
        </xsd:choice>
    </xsd:complexType>
    <xsd:complexType name="R">
        <xsd:complexContent>
            <xsd:restriction base="x:B">
                <xsd:choice>
                    <xsd:element name="c1" type="x:U2" />
                    <xsd:element name="c2" />
                </xsd:choice>
            </xsd:restriction>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:element name="doc">
        <xsd:complexType>
            <xsd:choice>
                <xsd:element name="elem" type="x:R" />
            </xsd:choice>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>'

Большие коллекции схем XML и условия исчерпания памяти

В ходе вызова встроенной функции XML_SCHEMA_NAMESPACE () на большой коллекции схем XML или при попытке удалить большую коллекцию схем XML, может возникнуть условие исчерпания памяти. Далее приводятся решения, которыми можно воспользоваться в данных ситуациях.

  • При небольшой системной загрузке используйте команду DROP_XML_SCHEMA_COLLECTION. При неудачном выполнении команды переведите базу данных в однопользовательский режим с помощью инструкции ALTER DATABASE и попытайтесь выполнить DROP XML SCHEMA COLLECTION снова. Если коллекция XML-схем присутствует в базе данных master, model или tempdb, то для перехода в однопользовательский режим потребуется перезапуск сервера.
  • При вызове XML_SCHEMA_NAMESPACE можно попытаться получить одиночное пространство имен XML-схемы, попробовать сделать вызов позже, когда снизится нагрузка в системе, или же попытаться произвести вызов в однопользовательском режиме.

Недетерминированные модели содержимого

SQL Server отклоняет XML-схемы, содержащие недетерминированные модели содержимого.

В следующем примере предпринимается попытка создать XML-схему с недетерминированной моделью содержимого. Выполнение этого кода приведет к ошибке, поскольку неясно, должен ли элемент <root> содержать последовательность из двух элементов <a> или же элемент <root> должен содержать две последовательности, состоящие из элемента <a>.

CREATE XML SCHEMA COLLECTION MyCollection AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema">
    <element name="root">
        <complexType>
            <sequence minOccurs="1" maxOccurs="2">
                <element name="a" type="string" minOccurs="1" maxOccurs="2"/>
            </sequence>
        </complexType>
    </element>
</schema>
'
GO

Эту схему можно исправить перемещением ограничения вхождения в однозначное расположение. Например, ограничение можно переместить в содержащий последовательность примитив:

<sequence minOccurs="1" maxOccurs="4">
    <element name="a" type="string" minOccurs="1" maxOccurs="1"/>
</sequence>

Ограничение можно также переместить во вложенный элемент:

<sequence minOccurs="1" maxOccurs="1">
     <element name="a" type="string" minOccurs="1" maxOccurs="4"/>
</sequence>

Работа SQL Server 2005 с пакетом обновления 1 (SP1)

Недетерминированные модели содержимого принимаются, если ограничение вхождений равно 0, 1 или без ограничений.

Следующий пример будет отвергнут в SQL Server 2005, но принят в SQL Server с пакетом обновления 1 (SP1).

CREATE XML SCHEMA COLLECTION MyCollection AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema">
    <element name="root">
        <complexType>
            <sequence minOccurs="0" maxOccurs="unbounded">
                <element name="a" type="string" minOccurs="0" maxOccurs="1"/>
                <element name="b" type="string" minOccurs="1" maxOccurs="unbounded"/>
            </sequence>
        </complexType>
    </element>
</schema>
'
GO

См. также

Справочник

Правила и ограничения по использованию коллекций XML-схем на сервере
Разрешения на коллекцию XML-схем
Управление коллекциями XML-схем на сервере

Основные понятия

Тип данных xml
Типизированный и нетипизированный XML
Основные сведения об ограничении однозначного соответствия примитивов

Справка и поддержка

Получение помощи по SQL Server 2005

Журнал изменений

Версия Журнал

14 апреля 2006 г.

Новое содержимое
  • Добавлен раздел с описанием работы с недетерминированными моделями содержимого в пакете обновления 1 (SP1).