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


Идентификация ключевых столбцов с использованием 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>

Создание рабочего образца этой схемы

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

  2. Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл под именем 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 &lt; 3]    </sql:xpath-query></ROOT>
    

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

    mapping-schema="C:\MyDir\KeyFields1.xml"
    
  3. Создайте и запустите тестовый сценарий 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>

Создание рабочего образца этой схемы

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

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