
Я уже как-то писал про то, что в SQL можно читать элементы XML прямо из столбца с соответствующим типом. Для того, чтобы SQL сервер контролировал правильность этого поля, используется специальный язык описания правил — XML Schema. Рассмотрим простейший пример такой схемы (сегодня все примеры для Microsoft SQL Server 2008):
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:complexType name="PointType">
     <xsd:attribute name="X" type="xsd:int" />
     <xsd:attribute name="Y" type="xsd:int" />
     <xsd:attribute name="Z" type="xsd:int" use="optional" />
    </xsd:complexType>
    <xsd:element name="Point" type="PointType" />
</xsd:schema>Данная схема разрешает только XML следующих видов: <Point X="100" Y="100" /> <!-- или --> <Point X="100" Y="100" Z="500"/>При этом атрибуты X и Y являются обязательными, а Z — опциональным. Для атрибутов допускается только тип int. В MS SQL Server создание подобной схемы будет выглядеть так:
CREATE XML SCHEMA COLLECTION test AS '
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:complexType name="PointType">
     <xsd:attribute name="X" type="xsd:int" />
     <xsd:attribute name="Y" type="xsd:int" />
     <xsd:attribute name="Z" type="xsd:int" use="optional" />
    </xsd:complexType>
    <xsd:element name="Point" type="PointType" />
</xsd:schema>
'
GOДалее можно попробовать создать xml с данной схемой (ниже используется переменная для того, чтобы этот код можно было легко скопировать и попробовать, но тоже самое верно и для столбца в таблице): -- объявляем переменную @xml с ранее созданной схемой test
DECLARE @xml xml(test)
-- заполняем тестовыми данными
SET @xml='<Point X="10" Y="10" />'
-- делаем выборку
SELECT @xml.value('(/Point/@X)[1]','int'), @xml.value('(/Point/@Y)[1]','int')При попытке записать невалидные данные SQL Server выдаст ошибку: -- пробуем задать невалидный XML SET @xml='<WrongPoint X="10" Y="10" />' -- получаем ошибку -- XML Validation: Declaration not found for element 'WrongPoint'. Location: /*:WrongPoint[1]Таким образом, наличие схемы гарантирует валидность данных и нет необходимости обрабатывать возможные ошибки самостоятельно.
Ссылки:
