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


Определение ключевых столбцов с помощью sql:key-fields (схема XDR)

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

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

При задании запроса XPath к схеме XDR в большинстве случаев для создания правильного порядка вложения в результатах необходима ключевая информация. Один из способов, гарантирующих создание правильной иерархии, — использование заметки sql:key-fields.

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

Чтобы правильно организовать вложенность в результатах, рекомендуется во всех схемах задавать заметку sql:key-fields.

Полезно понимать, как можно уникальным образом идентифицировать строки в таблице для создания соответствующей иерархии XML. Заметку sql:key-fields можно использовать вместе с <element> и <ElementType> для задания столбца или столбцов, уникальным образом определяющих строки таблицы.

Значение sql:key-fields идентифицирует столбец или столбцы, определяющие строки в связи, заданной <ElementType>. Если для уникальной идентификации строки требуется несколько столбцов, их значения разделяются пробелами.

Заметку sql:key-fields нужно задавать для элемента, содержащего дочерний элемент и заметку <sql:relationship>, которая задана между элементом и его дочерним элементом и не указывает первичный ключ таблицы, заданной в родительском элементе.

Примеры

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

А. Обеспечить соответствующий вид вложенности, когда заметка <sql:relationship> предоставляет недостаточно информации

В этом примере показано, где необходимо указывать sql:key-fields.

Рассмотрим следующую схему. Схема задает иерархию между элементами <Order> и <Customer>, где элемент <Order> является родительским, а <Customer> — дочерним.

Для задания отношения «родитель-потомок» используется тег <sql:relationship> . Тег <sql:relationship> указывает, что CustomerID представляет собой foreign-key в таблице Sales.SalesOrderHeader и ссылается на ключ CustomerID в таблице Sales.Customer. Заметка <sql:relationship> содержит недостаточно сведений, чтобы однозначно идентифицировать строки в родительской таблице (Sales.SalesOrderHeader). Поэтому без заметки sql:key-fields созданная иерархия будет неточной.

С помощью заметки sql:key-fields, заданной для элемента <Order>, заметка однозначно определяет строки родительской таблицы (Sales.SalesOrderHeader) и ее дочерние элементы выводятся под родительским элементом.

Схема:

<?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="Customer" sql:relation="Sales.Customer">
    <AttributeType name="CustomerID" />
    <attribute type="CustomerID" />
  </ElementType>

  <ElementType name="Order" sql:relation="Sales.SalesOrderHeader" 
                            sql:key-fields="SalesOrderID" >
    <AttributeType name="SalesOrderID" />
    <AttributeType name="CustomerID" />
 
    <attribute type="SalesOrderID" />
    <attribute type="CustomerID" />
    <element type="Customer" >
             <sql:relationship
                         key-relation="Sales.SalesOrderHeader"
                         key="CustomerID"
                         foreign-relation="Sales.Customer"
                         foreign-key="CustomerID" />
    </element>
     </ElementType>
</Schema>

Проверка рабочего образца схемы

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

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

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="KeyFieldsA-Xdr.xml">
        /Order
      </sql:xpath-query>
    </ROOT>
    

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

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

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

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

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <Order SalesOrderID="43659" CustomerID="676">
    <Customer CustomerID="676" /> 
  </Order>
  <Order SalesOrderID="43660" CustomerID="117">
    <Customer CustomerID="117" /> 
  </Order>
  <Order SalesOrderID="43661" CustomerID="442">
    <Customer CustomerID="442" /> 
  </Order>
  ...
</ROOT>

Б. Задать заметку sql:key-fields для обеспечения правильной вложенности результатов

В данной схеме нет иерархии, которая определялась бы заметкой <sql:relationship>. Эта схема по-прежнему требует заметки sql:key-fields для уникальной идентификации сотрудников в таблице HumanResources.Employee.

<?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="Title" content="textOnly"  >
      <AttributeType name="BusinessEntityID" />
      <attribute type="BusinessEntityID" />
   </ElementType>

   <ElementType name="HumanResources.Employee" sql:key-fields="BusinessEntityID" >
      <element type="JobTitle" />
   </ElementType>
</Schema>

Проверка рабочего образца схемы

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

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

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="KeyFieldsB-Xdr.xml">
        /HumanResources.Employee
      </sql:xpath-query>
    </ROOT>
    

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

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

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

Вот часть результирующего набора:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <HumanResources.Employee>
    <Title BusinessEntityID="1">Production Technician - WC60</Title> 
  </HumanResources.Employee>
  <HumanResources.Employee>
    <Title BusinessEntityID="2">Marketing Assistant</Title> 
  </HumanResources.Employee>
  <HumanResources.Employee>
    <Title BusinessEntityID="3">Engineering Manager</Title> 
  </HumanResources.Employee>
   ...
</ROOT>