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


Идентификация ключевых столбцов с использованием sql:key-fields (SQLXML 4.0)

Применимо к:База данных SQL ServerAzure SQL

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

Примечание

Чтобы обеспечить правильное вложение, рекомендуется указать sql:key-fields для элементов, сопоставленных с таблицами. Формируемый XML-код является зависимым от упорядочения базового результирующего набора. Если параметр sql:key-fields не указан, созданный XML-файл может быть сформирован неправильно.

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

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

Примеры

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

A. Создание соответствующей вложенной среды, если <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 < 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>