Поделиться через


Создание допустимых атрибутов типа ID, IDREF и IDREFS с помощью sql:id-prefix (схема XDR)

Важное примечаниеВажно!

Этот раздел включен в документацию в качестве справочника по приложениям прежних версий. Дальнейшая разработка этой функции проводиться не будет. Рекомендуется избегать использования данной функции в новых разработках. Вместо этого для создания XML-представлений пользуйтесь схемами XSD с заметками. Дополнительные сведения см. в разделе Введение в схемы XSD с заметками (SQLXML 4.0). Можно преобразовать существующие схемы XDR с заметками в схемы XSD. Дополнительные сведения см. в разделе Преобразование схем XDR с заметками в эквивалентные схемы XSD (SQLXML 4.0).

Атрибут может быть задан как атрибут типа ID. Атрибуты, указанные как IDREF или IDREFS, можно использовать для ссылок на атрибуты типа ID, таким образом разрешая ссылки внутри документов.

Типы ID, IDREF и IDREFS соответствуют связям первичный-внешний ключ в базе данных, но с некоторыми отличиями. В XML-документе значения атрибутов типа ID должны быть различными. Если в XML-документе содержатся атрибуты CustomerID и SalesOrderID, эти значения должны быть различными. Однако в базе данных столбцы CustomerID и SalesOrderID могут иметь одинаковые значения (например, в базе данных допустимы значения CustomerID = 1 и OrderID = 1).

Чтобы атрибуты ID, IDREF и IDREFS были допустимыми, должны выполняться следующие условия.

  • Значение атрибута ID должно быть уникальным в пределах XML-документа.

  • Для каждого атрибута IDREF и IDREFS в XML-документе должны присутствовать значения ID, на которые ссылается этот атрибут.

  • Значением ID, IDREF и IDREFS должен быть именованный токен (например, целое значение 101 не может быть значением ID).

  • Атрибуты типа ID, IDREF и IDREFS не могут быть сопоставлены столбцам типа text, ntext, image или любым другим данным двоичного типа (например, timestamp).

Если XML-документ содержит несколько идентификаторов, указывается заметка sql:id-prefix, чтобы сделать значения уникальными. . Заметка The sql:id-prefix используется также для создания именованных токенов из чисел. Значение, указанное для заметки sql:id-prefix, должно быть допустимым символом имени.

Атрибут sql:id-prefixпредваряет значения ID, IDREF и IDREFS строкой, что делает их уникальными. Не выполняется никаких проверок, чтобы обеспечить достоверность префиксов и уникальность значений ID, IDREF и IDREFS.

Атрибут sql:id-prefixне учитывается для атрибутов типов, отличных от ID, IDREF и IDREFS.

ПримечаниеПримечание

Каждое значение атрибутов ID, IDREF и IDREFS ограничено 4 000 символов, включая префикс (если указан).

Примеры

Чтобы создать рабочие образцы на основе следующих примеров, необходимо выполнить определенные требования. Дополнительные сведения см. в разделе Требования к запуску примеров SQLXML.

А. Указание заметки sql:id-prefix для атрибута типа ID

В этой схеме XDR атрибуты SalesOrderID и CustomerID объявлены как тип ID. Чтобы обеспечить уникальность и допустимость значений, для атрибутов указывается заметка sql:id-prefix:

<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
        xmlns:dt="urn:schemas-microsoft-com:datatypes"
        xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <ElementType name="Order" sql:relation="Sales.SalesOrderHeader" sql:key-fields="SalesOrderID">
    <AttributeType name="SalesOrderID" dt:type="id" sql:id-prefix="Ord-" />
    <AttributeType name="OrderDate" />
 
    <attribute type="SalesOrderID" />
    <attribute type="OrderDate" />
  </ElementType>

  <ElementType name="Customer" sql:relation="Sales.Customer">
    <AttributeType name="CustomerID" dt:type="id" />
    <attribute type="CustomerID" />
    <AttributeType name="OrderList" dt:type="idrefs"
                                 sql:id-prefix="Ord-" />
    <attribute type="OrderList" sql:relation="Sales.SalesOrderHeader" sql:field="SalesOrderID">
        <sql:relationship
                key-relation="Sales.Customer"
                key="CustomerID"
                foreign-relation="Sales.SalesOrderHeader"
                foreign-key="CustomerID" />
    </attribute>
    <element type="Order">
        <sql:relationship key-relation="Sales.SalesOrderHeader"
                          key="SalesOrderID"
                          foreign-relation="Sales.Customer"
                          foreign-key="SalesOrderID" />
    </element>
  </ElementType>
</Schema>

Проверка образца запроса XPath к схеме

  1. Скопируйте приведенный выше код схемы и вставьте его в текстовый файл. Сохраните файл как sqlPrefix-Xdr.xml.

  2. Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл под именем sqlPrefix-XdrT.xml в том же каталоге, где был сохранен файл sqlPrefix-Xdr.xml. Запрос XPath в шаблоне возвращает все подэлементы <Customer> и <Order> со значением CustomerID, равным 1.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="sqlPrefix-Xdr.xml">
        Customer[@CustomerID="1"]
      </sql:xpath-query>
    </ROOT>
    

    Путь к каталогу для схемы сопоставления (sqlPrefix-Xdr.xml) задается относительно каталога, в котором сохранен шаблон. Можно также задать абсолютный путь, например:

    mapping-schema="C:\MyDir\sqlPrefix-Xdr.xml"
    
  3. Создайте и запустите тестовый скрипт SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить шаблон.

    Дополнительные сведения см. в разделе Использование ADO для выполнения запросов SQLXML 4.0.

Полученный результирующий набор показан ниже.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <Customer CustomerID="1" OrderIDList="Ord-43860 Ord-44501 Ord-45283 Ord-46042">
    <Order SalesOrderID="Ord-43860" OrderDate="2005-08-01T00:00:00" /> 
    <Order SalesOrderID="Ord-44501" OrderDate="2005-11-01T00:00:00" /> 
    <Order SalesOrderID="Ord-45283" OrderDate="2006-02-01T00:00:00" /> 
    <Order SalesOrderID="Ord-46042" OrderDate="2006-05-01T00:00:00" /> 
  </Customer>
</ROOT>