Схемы 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>
Он проверяет ваш пример и выдает ошибки для:
- дубликаты идентификаторов
- идентификаторы, которые не являются отрицательными целыми числами.
Вот ваши, например, плюс тесты:
<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.