Compartilhar via


Identificando colunas de chave usando sql:key-fields (esquema XDR)

Observação importanteImportante

Este tópico está incluso como referência para aplicativos herdados. Não será feito nenhum trabalho de desenvolvimento futuro nesse recurso. Evite usá-lo em novos trabalhos de desenvolvimento. Em vez disso, use esquemas XSD anotados para criar exibições XML. Para obter mais informações, consulte Introdução a esquemas XSD anotados (SQLXML 4.0). Você pode converter esquemas XDR anotados existentes em esquemas XSD. Para obter mais informações, consulte Convertendo esquemas XDR anotados a esquemas XSD equivalentes (SQLXML 4.0).

Quando uma consulta XPath é especificada no esquema XDR, informações de chave são necessárias, na maioria das vezes, para obter o aninhamento adequado no resultado. Especificar a anotação sql:key-fields é uma forma de assegurar que a hierarquia apropriada seja gerada.

ObservaçãoObservação

Para gerar o aninhamento adequado no resultado, recomenda-se que sql:key-fields seja especificado em todos os esquemas.

Em muitos casos, é necessário entender como identificar as linhas de forma exclusiva em uma tabela para gerar a hierarquia XML adequada. A anotação sql:key-fields pode ser adicionada a <element> e a <ElementType> para identificar as colunas que identificam as linhas de forma exclusiva na tabela.

O valor de sql:key-fields identifica as colunas que identificam as linhas de forma exclusiva na relação especificada em <ElementType>. Se mais de uma coluna for necessária para identificar uma linha de forma exclusiva, os valores de coluna serão listados separados com um espaço.

A anotação sql:key-fields deve ser especificada em um elemento que contém um elemento filho e um <sql:relationship>, definido entre o elemento e o filho, que não fornece a chave primária da tabela especificada no elemento pai.

Exemplos

Para criar exemplos de funcionamento usando os exemplos a seguir, é necessário atender a determinados requisitos. Para obter mais informações, consulte Requisitos para executar exemplos do SQLXML.

A. Produzir o aninhamento adequado quando <sql:relationship> não fornecer informações suficientes

Esse exemplo mostra onde sql:key-fields deve ser especificada.

Considere o esquema a seguir. O esquema especifica a hierarquia entre os elementos <Order> e <Customer> nos quais o elemento <Order> é o pai e o elemento <Customer> é um filho.

A marca <sql:relationship> é usada para especificar a relação pai-filho. A marca <sql:relationship> identifica CustomerID como foreign-key na tabela Sales.SalesOrderHeader, em referência à chave CustomerID na tabela Sales.Customer. Essas informações fornecidas em <sql:relationship> não são suficientes para identificar linhas de forma exclusiva na tabela pai (Sales.SalesOrderHeader). Portanto, sem sql:key-fields, a hierarquia gerada será imprecisa.

Com sql:key-fields especificado em <Order>, a anotação identifica as linhas de forma exclusiva no pai (tabela Sales.SalesOrderHeader) e seus elementos filhos aparecem abaixo do seu pai.

Este é o esquema:

<?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>

Para testar um exemplo de funcionamento deste esquema

  1. Copie o código de esquema acima e cole-o em um arquivo de texto. Salve o arquivo como KeyFieldsA-Xdr.xml.

  2. Copie o modelo a seguir e cole-o em um arquivo de texto. Salve o arquivo como KeyFieldsA-XdrT.xml no mesmo diretório onde você salvou 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>
    

    O caminho de diretório especificado para o esquema de mapeamento (KeyFieldsA-Xdr.xml) é relativo ao diretório onde o modelo está salvo. Também é possível especificar um caminho absoluto, por exemplo:

    mapping-schema="C:\MyDir\KeyFieldsA-Xdr.xml"
    
  3. Crie e use o script de teste SQLXML 4.0 (Sqlxml4test.vbs) para executar o modelo.

    Para obter mais informações, consulte Usando o ADO para executar consultas do SQLXML 4.0.

A seguir está o conjunto de resultados:

<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>

B. Especificar sql:key-fields para produzir o aninhamento adequado no resultado

Neste esquema, nenhuma hierarquia é especificada com <sql:relationship>. O esquema ainda requer que a anotação sql:key-fields seja especificada para identificar os funcionários de forma exclusiva na tabela 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>

Para testar um exemplo de funcionamento deste esquema

  1. Copie o código de esquema acima e cole-o em um arquivo de texto. Salve o arquivo como KeyFieldsB-Xdr.xml.

  2. Copie o modelo a seguir e cole-o em um arquivo de texto. Salve o arquivo como KeyFieldsB-XdrT.xml no mesmo diretório onde você salvou KeyFieldsB-Xdr.xml. A consulta XPath no modelo retorna todos os elementos <Order>.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="KeyFieldsB-Xdr.xml">
        /HumanResources.Employee
      </sql:xpath-query>
    </ROOT>
    

    O caminho de diretório especificado para o esquema de mapeamento (KeyFieldsB-Xdr.xml) é relativo ao diretório onde o modelo está salvo. Também é possível especificar um caminho absoluto, por exemplo:

    mapping-schema="C:\MyDir\KeyFieldsB-Xdr.xml"
    
  3. Crie e use o script de teste SQLXML 4.0 (Sqlxml4test.vbs) para executar o modelo.

    Para obter mais informações, consulte Usando o ADO para executar consultas do SQLXML 4.0.

Esta é uma parte do conjunto de resultados:

<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>

Consulte também

Referência