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


Определение ключевых столбцов с помощью 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="EmployeeID" />      <attribute type="EmployeeID" />   </ElementType>   <ElementType name="HumanResources.Employee" sql:key-fields="EmployeeID" >      <element type="Title" />   </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 EmployeeID="1">Production Technician - WC60</Title>   </HumanResources.Employee>  <HumanResources.Employee>    <Title EmployeeID="2">Marketing Assistant</Title>   </HumanResources.Employee>  <HumanResources.Employee>    <Title EmployeeID="3">Engineering Manager</Title>   </HumanResources.Employee>   ...</ROOT>