Схемы SQL 2005 XML - определение уникального атрибута

Вот пример XML-документа, для которого я пытаюсь создать схему:

'<Fields>
  <Field ID="-1">somevalue</Field>
  <Field ID="-2" />
  <Field ID="-3" />
  <Field ID="-4">Some other value</Field>
  <Field ID="-5" />
</Fields>'

Я пытаюсь создать коллекцию схем SQL Server 2005 для:
1. предотвратить дублирование идентификаторов.
2. разрешать только отрицательные идентификаторы.

Я могу добиться отрицательного ограничения с помощью type="xs: positiveInteger" для атрибута id. Но я не могу создать уникальное ограничение или ключ \keyref в SQL 2005. Если я установлю свой type="xs:ID", то я вообще не смогу использовать числа для значений идентификаторов, не говоря уже о отрицательных идентификаторах.

Либо я что-то упустил, либо это невозможно. Если это невозможно, почему SQL 2005 не поддерживает возможность иметь уникальный атрибут? Есть ли обходной путь, использующий ограничение \ триггер или индекс xml для таблицы, или какой-то другой метод, который я даже сейчас не могу себе представить?

Вся помощь очень ценится.

2 ответа

Вот решение, использующее "unique" ("key" также работает):

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Fields">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="Field"/>
      </xs:sequence>
    </xs:complexType>

    <xs:unique name="nearlyID">
      <xs:selector xpath=".//*"/>  
      <xs:field xpath="@ID"/>
    </xs:unique>
  </xs:element>


  <xs:element name="Field">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:string">
          <xs:attribute name="ID" type="xs:negativeInteger"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

Он проверяет ваш пример и выдает ошибки для:

  1. дубликаты идентификаторов
  2. идентификаторы, которые не являются отрицательными целыми числами.

Вот ваши, например, плюс тесты:

<Fields>
  <Field ID="-1">somevalue</Field>
  <Field ID="-2" />
  <Field ID="-3" />
  <Field ID="-4">Some other value</Field>
  <Field ID="-5" />

  <Field ID="-2"   >  not unique   </Field>
  <Field ID="2"    >  not negative </Field>
  <Field ID="hello">  not integer  </Field>
</Fields>

РЕДАКТИРОВАТЬ Я понятия не имею, если это лучший способ или даже если это хороший способ. Это работает, но я думаю, что может быть более простой и простой способ.

Это старый пост, но он все еще актуален сегодня, так как уникальный синтаксис не поддерживается (и не обязательно с ответом ниже).

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

Затем вы создаете постоянный вычисляемый столбец в таблице, содержащей столбец xml. Этот вычисляемый столбец будет выполнять функцию привязки схемы, определенную выше.

Наконец, вы определяете уникальное ограничение для сохраняемого вычисляемого столбца. Теперь он не только гарантированно уникален, но и проиндексирован для быстрого поиска.

РЕДАКТИРОВАТЬ -

Это работает для атрибутов верхнего уровня, которые должны быть уникальными в нескольких строках.

Если вам нужна уникальность в коллекции элементов в одном XML-документе, подход аналогичен.

Вы создаете функцию, которая принимает тип данных xml в качестве параметра и возвращает значение BIT.

Затем вы используете xpath для типа данных xml, чтобы самостоятельно проверить уникальность. Если значения уникальны, возвращают 1, если не возвращают 0.

Наконец, вы добавляете проверочное ограничение к таблице, которая вызывает скалярную функцию и проверяет, что результат равен 1.

Другие вопросы по тегам