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


Создание допустимых атрибутов типа ID, IDREF и IDREFS с использованием sql:prefix (SQLXML 4.0)

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

.ID, IDREF и IDREFS соответствуют связям «первичный-внешний ключ в базе данных с некоторыми отличиями. В XML-документе значения атрибутов типа ID должны быть различны. Если в XML-документе для атрибутов CustomerID и OrderID задан тип ID, эти значения должны быть различны. Однако в базе данных столбцы CustomerID и OrderID могут иметь одинаковые значения. (Например, значения 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-документ содержит несколько IDs, используйте заметку sql:prefix, чтобы гарантировать уникальность значений.

Обратите внимание, что заметку sql:prefix невозможно использовать с атрибутом неизменности XSD.

Примеры

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

А. Задание типов ID и IDREFS

В следующей схеме элемент <Customer> состоит из дочернего элемента <Order> child element. Элемент <Order> тоже содержит дочерний элемент <OrderDetail>.

Атрибут OrderIDList элемента <Customer> является атрибутом типа IDREFS , ссылающимся на атрибут OrderID элемента <Order>.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"            xmlns:sql="urn:schemas-microsoft-com:mapping-schema"><xsd:annotation>  <xsd:appinfo>    <sql:relationship name="CustOrders"                 parent="Sales.Customer"                 parent-key="CustomerID"                 child="Sales.SalesOrderHeader"                 child-key="CustomerID" />    <sql:relationship name="OrderOrderDetail"                 parent="Sales.SalesOrderHeader"                 parent-key="SalesOrderID"                 child="Sales.SalesOrderDetail"                 child-key="SalesOrderID" />  </xsd:appinfo></xsd:annotation>  <xsd:element name="Customer" sql:relation="Sales.Customer" >   <xsd:complexType>     <xsd:sequence>        <xsd:element name="Order" sql:relation="Sales.SalesOrderHeader"                 sql:relationship="CustOrders" maxOccurs="unbounded" >          <xsd:complexType>              <xsd:sequence>                <xsd:element name="OrderDetail"                              sql:relation="Sales.SalesOrderDetail"                    sql:relationship="OrderOrderDetail"                    maxOccurs="unbounded" >                  <xsd:complexType>                   <xsd:attribute name="SalesOrderID" type="xsd:integer" />                   <xsd:attribute name="ProductID" type="xsd:string" />                   <xsd:attribute name="OrderQty" type="xsd:integer" />                  </xsd:complexType>               </xsd:element>             </xsd:sequence>             <xsd:attribute name="SalesOrderID"                             type="xsd:ID" sql:prefix="ord-" />             <xsd:attribute name="OrderDate" type="xsd:date" />             <xsd:attribute name="CustomerID" type="xsd:string" />          </xsd:complexType>      </xsd:element>    </xsd:sequence>    <xsd:attribute name="CustomerID" type="xsd:string" />    <xsd:attribute name="OrderIDList" type="xsd:IDREFS"                    sql:relation="Sales.SalesOrderHeader" sql:field="SalesOrderID"                   sql:relationship="CustOrders" sql:prefix="ord-">    </xsd:attribute>  </xsd:complexType></xsd:element></xsd:schema>

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

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

  2. Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл под именем sqlPrefixT.xml в том же каталоге, где был сохранен файл sqlPrefix.xml.

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

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

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

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

Промежуточный результат:

<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="2001-08-01" CustomerID="1">      <OrderDetail SalesOrderID="43860" ProductID="729" OrderQty="1" />       <OrderDetail SalesOrderID="43860" ProductID="732" OrderQty="1" />       <OrderDetail SalesOrderID="43860" ProductID="738" OrderQty="1" />       <OrderDetail SalesOrderID="43860" ProductID="753" OrderQty="2" />       ...    </Order>    ... </Customer></ROOT>