Идентификация ключевых столбцов с использованием sql:key-fields (SQLXML 4.0)
При указании запроса XPath к схеме XSD в большинстве случаев необходимы ключевые сведения, чтобы правильно организовать вложенность в результатах. Указание заметки sql:key-fields является способом, который гарантирует формирование надлежащей иерархии.
![]() |
---|
Чтобы гарантировать надлежащую вложенность, рекомендуется указать заметки sql:key-fields для элементов, которые сопоставляются с таблицами. Формируемый XML чувствителен к порядку базового результирующего набора. Если заметкаsql:key-fields не указана, результирующий XML может быть сформирован ненадлежащим образом. |
Значение sql:key-fields идентифицирует столбец (столбцы), которые уникальным образом идентифицируют строки в отношении. Если для уникальной идентификации строки требуется более одного столбца, значения столбца разделяются пробелами.
Заметку sql:key-fields использовать необходимо, если элемент содержит тег <sql:relationship>, который определен между элементом и дочерним элементом, но не содержит первичный ключ таблицы, указанной в родительском элементе.
Примеры
Чтобы создать рабочие образцы на основе следующих примеров, необходимо выполнить определенные требования. Дополнительные сведения см. в разделе Требования к запуску примеров SQLXML.
А. Создание верной вложенности в случае, когда тег <sql:relationship> не предоставляет достаточно сведений.
В этом примере показано, где необходимо указывать sql:key-fields.
Рассмотрим следующую схему. Схема задает иерархию между элементами <Order> и <Customer>, в которой элемент <Order> является родительским, а элемент <Customer> является дочерним.
Тег <sql:relationship> используется для задания связи типа «родители-потомки». Он идентифицирует CustomerID в таблице Sales.SalesOrderHeader как родительский ключ, который ссылается на дочерний ключ CustomerID таблицы Sales.Customer. Сведения, предоставленные в теге <sql:relationship> не достаточны для уникальной идентификации строк в родительской таблице (Sales.SalesOrderHeader). Поэтому без заметки sql:key-fields формируемая иерархия является неточной.
С заметкой sql:key-fields, заданной в <Order>, заметка уникальным образом идентифицирует строки в родительской таблице (Sales.SalesOrderHeader), и дочерние элементы появляются под родительским.
Схема:
<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="OrdCust" parent="Sales.SalesOrderHeader" parent-key="CustomerID" child="Sales.Customer" child-key="CustomerID" /> </xsd:appinfo></xsd:annotation> <xsd:element name="Order" sql:relation="Sales.SalesOrderHeader" sql:key-fields="SalesOrderID"> <xsd:complexType> <xsd:sequence> <xsd:element name="Customer" sql:relation="Sales.Customer" sql:relationship="OrdCust" > <xsd:complexType> <xsd:attribute name="CustID" sql:field="CustomerID" /> <xsd:attribute name="SoldBy" sql:field="SalesPersonID" /> </xsd:complexType> </xsd:element> </xsd:sequence> <xsd:attribute name="SalesOrderID" type="xsd:integer" /> <xsd:attribute name= "CustomerID" type="xsd:string" /> </xsd:complexType> </xsd:element></xsd:schema>
Создание рабочего образца этой схемы
Скопируйте приведенный выше код схемы и вставьте его в текстовый файл. Сохраните файл под именем KeyFields1.xml.
Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл под именем KeyFields1T.xml в том же каталоге, где был сохранен файл KeyFields1.xml. Запрос XPath в шаблоне возвращает все элементы <Order> с CustomerID меньше 3.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="KeyFields1.xml"> /Order[@CustomerID < 3] </sql:xpath-query></ROOT>
Путь к каталогу для схемы сопоставления (KeyFields1.xml) задается относительно каталога, в котором сохранен шаблон. Можно также задать абсолютный путь, например:
mapping-schema="C:\MyDir\KeyFields1.xml"
Создайте и запустите тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить шаблон.
Дополнительные сведения см. в разделе Использование объектов ADO для выполнения запросов SQLXML.
Ниже приведен частичный результирующий набор.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <Order SalesOrderID="43860" CustomerID="1"> <Customer CustID="1" SoldBy="280"/> </Order> <Order SalesOrderID="44501" CustomerID="1"> <Customer CustID="1" SoldBy="280"/> </Order> <Order SalesOrderID="45283" CustomerID="1"> <Customer CustID="1" SoldBy="280"/> </Order> .....</ROOT>
Б. Указание sql:key-fields для получение верной вложенности в результате
В следующей схеме отсутствует иерархия, заданная с помощью <sql:relationship>. В схеме до сих пор требуется указать заметку sql:key-fields, чтобы уникальным образом идентифицировать сотрудников в таблице HumanResources.Employee.
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema"> <xsd:element name="HumanResources.Employee" sql:key-fields="EmployeeID" > <xsd:complexType> <xsd:sequence> <xsd:element name="Title"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attribute name="EmployeeID" type="xsd:integer" /> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element></xsd:schema>
Создание рабочего образца этой схемы
Скопируйте приведенный выше код схемы и вставьте его в текстовый файл. Сохраните файл под именем KeyFields2.xml.
Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл под именем KeyFields2T.xml в том же каталоге, где был сохранен файл KeyFields2.xml. Запрос XPath в шаблоне возвращает все элементы <HumanResources.Employee>:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="KeyFields2.xml"> /HumanResources.Employee </sql:xpath-query></ROOT>
Путь к каталогу для схемы сопоставления (KeyFields2.xml) задается относительно каталога, в котором сохранен шаблон. Можно также задать абсолютный путь, например:
mapping-schema="C:\MyDir\KeyFields2.xml"
Создайте и запустите тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить шаблон.
Дополнительные сведения см. в разделе Использование объектов ADO для выполнения запросов SQLXML.
Результирующий набор:
<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>