Определение ключевых столбцов с помощью 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>
Проверка рабочего образца схемы
Скопируйте приведенный выше код схемы и вставьте его в текстовый файл. Сохраните файл под именем KeyFieldsA-Xdr.xml.
Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл под именем 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"
Создайте и запустите тестовый сценарий 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>
Проверка рабочего образца схемы
Скопируйте приведенный выше код схемы и вставьте его в текстовый файл. Сохраните файл под именем KeyFieldsB-Xdr.xml.
Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл под именем 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"
Создайте и запустите тестовый сценарий 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>