XML-схемы SQL 2005 - Определение уникального атрибута - PullRequest
1 голос
/ 16 мая 2009

Вот пример 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: absoluteInteger" для атрибута id. Но я не могу создать уникальное ограничение или ключ \ keyref в SQL 2005. Если я установлю свой type = "xs: ID", то я вообще не смогу использовать числа для значений идентификаторов, не говоря уже о отрицательных идентификаторах.

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

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

Ответы [ 2 ]

1 голос
/ 16 мая 2009

Вот решение, использующее «уникальный» («ключ» также работает):

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

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

0 голосов
/ 26 января 2017

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

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

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

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

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

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

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

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

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

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

...